我正在尝试做一些接近此的事情:
template<typename TChar, size_t TSize>
inline size_t StringLength(TChar(&)[TSize])
{
return TSize - 1;
}
template<typename TChar>
inline size_t StringLength(const TChar* value)
{
return std::char_traits<TChar>::length(value);
}
...但是当调用StringLength(“abc”)时,编译器发现它是模棱两可的:
test.cpp(15): could be 'size_t StringLength<char>(const TChar *const )'
with
[
TChar=char
]
test.cpp(9): or 'size_t StringLength<const char,4>(TChar (&)[4])'
with
[
TChar=const char
]
while trying to match the argument list '(const char [4])'
(此测试是在VS2013中完成的。)
我只想避免在有可用尺寸时感到吃惊。有没有办法做到这一点,或者比我正在尝试的更好的选择?
最佳答案
只需按const引用获取指针,即可在模板参数推导过程中阻止数组到指针的转换:
template<typename TChar>
inline size_t StringLength(const TChar* const & value)
//^^^^^^^
{
return std::char_traits<TChar>::length(value);
}
Demo。
关于c++ - 如何让编译器选择模板的静态数组版本而不是指针?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27376003/