c++ 如何在编译时获取字符串长度?[已关闭]

jm2pwxwz  于 2022-12-27  发布在  其他
关注(0)|答案(3)|浏览(158)

14小时前关门了。
Improve this question
考虑具有两个构造函数的BasicCharp类:

template <class CharType>
class BasicCharp {
    public:
        using value_type    = CharType;
        using pointer       = value_type*;
        public:
//1
            template<size_t SIZE>
            constexpr BasicCharp(value_type (&str)[SIZE]) noexcept
                : m_Length(SIZE)
                , m_String(str) {}
//2
            constexpr BasicCharp(pointer string) noexcept
                : m_Length(countElems(string))
                , m_String(string) {}
        private:
        size_t m_Length;
        pointer m_String;
};

施工:

BasicCharp<const char> str = "test";

它调用构造函数2,但是如果没有构造函数2,它调用构造函数1。
如何保留构造函数2,但如果可能的话强制使用构造函数1?
一个c++17的解决方案是首选,但任何标准的是受欢迎的。
目标是在编译时推断字符串字面量的大小,但如果传递了一个指针,则大小应由构造函数计算。

2w3kk1z5

2w3kk1z51#

重载不明确;衰减的数组指针并不比未衰减的指针更好或更差。2它只是因为非模板重载比模板重载匹配得更好才编译。
您可以做的是使指针重载成为更差的重载候选对象,例如,通过引入用户定义的转换序列。

struct ptr { pointer p; ptr(pointer p) : p(p) {} };

        constexpr BasicCharp(ptr string) noexcept
            : m_Length(countElems(string.p))
            , m_String(string.p) {}
lfapxunr

lfapxunr2#

不完全相同,但您可以标记dispatch,如下所示:

template <typename > struct Tag{};

template <class CharType>
class BasicCharp {
// ...
public:
    template<typename T>
    constexpr BasicCharp(const T& str) noexcept : BasicCharp(str, Tag<T>{})
    {
        // Or alternatively, use if constexpr here
    }

private:
    template<std::size_t SIZE>
    constexpr BasicCharp(const value_type (&str)[SIZE],
                         Tag<value_type[SIZE]>) noexcept
        : m_Length(SIZE)
        , m_String(str) {}

    constexpr BasicCharp(const value_type*string, Tag<const value_type*>) noexcept
        : m_Length(countElems(string))
        , m_String(string) {}
};
zdwk9cvp

zdwk9cvp3#

你可以将结果赋给constexpr变量,但不能100%保证这会在编译时完成,你也可以使用consteval,在这种情况下,如果变量没有在编译时赋值,你会得到错误(consteval在c++20下工作)

相关问题