【发布时间】:2016-08-01 02:13:25
【问题描述】:
我最近开始在 C++ 中使用模板元编程,并尝试评估 C 风格字符串的长度。
我在这段代码上取得了一些成功
template <const char *str, std::size_t index>
class str_length {
public:
static inline std::size_t val() {
return (str[index] != '\0') ? (1 + str_length<str, index + 1>::val()) : 0;
}
};
template <const char *str>
class str_length <str, 500> {
public:
static inline std::size_t val() {
return 0;
}
};
extern const char bitarr[] { "0000000000000000000" };
int main() {
std::cout << str_length<bitarr, 0>::val() << std::endl;
getchar();
return 0;
}
但是,我必须通过创建 str_length 的特化来设置 500 的“上限”。忽略它会导致我的编译器无限期运行(可能会创建 str_length 的无限特化)。
有什么办法可以不指定 index = 500 限制吗? 如果有帮助,我正在使用 VC++2015。
哦,我没有使用 constexpr,因为 VC++ 还不完全支持 C++14 扩展的 constexpr 功能。 (https://msdn.microsoft.com/en-us/library/hh567368.aspx#cpp14table)
【问题讨论】:
-
你为什么不使用
bitarr是一个 array 并因此已经具有编译时大小的事实? -
正如我所说,只是在玩 TMP。
-
@NicolBolas 在数组末尾可能有 '\0'。不太可能,但可能。
标签: c++ template-meta-programming