我正在尝试制作一个编译时字符串类。我从这篇文章中得到了一些提示。不幸的是,我坚持构造函数重载优先级: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()
- 执行相等性测试而不是散列大小 < N 的编译时字符串集。(这是我正在查看的一个应用程序的多个 CPU 开销)