【发布时间】:2016-04-06 18:41:06
【问题描述】:
我正在尝试创建一个编译时字符串类。我从this post 那里得到了一些提示。不幸的是,我坚持构造函数重载优先级:const char[] 构造函数被 const char* 构造函数所取代。任何提示将不胜感激!
class string {
public:
// Can be done compile time. Works lovely! except...
template<size_t N>
constexpr string(const char(&char_array)[N])
: ptr_(char_array), length_(N-1) {}
// This override gets called instead. I *must* keep this constructor.
string(const char* const str)
: ptr_(str) {
length_ = strlen(str);
}
// Ugly hack. (not acceptable)
template<size_t N>
constexpr string(const char(&char_array)[N], double unused)
: ptr_(char_array), length_(N-1) {}
private:
const char* ptr_;
int length_;
};
constexpr const char kConstant[] = "FooBarBaz";
constexpr string kString(kConstant); // Error: constexpr variable 'kString' must be initialized by a constant expression (tries to call wrong overload)
constexpr string kString(kConstant, 1.0f); // ugly hack works.
如果我可以制作编译时字符串常量,我可以做很多很酷的事情。
-
string上的字符串相等性测试比const char *上更快 - 消除从
const char *到string的隐式转换在编译时常量字符串上调用strlen()的运行时开销。 - 编译时字符串集执行相等性测试而不是散列大小
【问题讨论】:
-
如果您查看the
std::stringconstructor overloads,您会发现它们甚至不关心数组,只关心指针。 -
它们也不支持 constexpr 构造!这才是重点。模板化字符数组能够在编译时检测字符串大小。
-
非模板函数优先于模板函数,即使它需要指针衰减。不过,我不知道如何解决这个问题。当我尝试这样做时,我自己也遇到了同样的问题,最后选择了基于可变参数模板的字符串。
-
即使我注释掉
string(const char *),此代码也无法在 gcc 5.1.0 中编译是编译器的问题吗? - 错误:'string{((const char*)(& kConstant)), 9}' 不是常量表达式 -
@Slava,为我编译...
标签: c++ string constexpr compile-time-constant constructor-overloading