我正在尝试做一些接近这个的事情:
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);
}
Run Code Online (Sandbox Code Playgroud)
...但是在调用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])'
Run Code Online (Sandbox Code Playgroud)
(此测试在VS2013中完成.)
当尺寸可用时,我只想避免使用strlen.有没有办法做到这一点,或者比我正在尝试的更好的选择?
只需通过 const 引用获取指针,这会在模板参数推导过程中阻止数组到指针的转换:
template<typename TChar>
inline size_t StringLength(const TChar* const & value)
//^^^^^^^
{
return std::char_traits<TChar>::length(value);
}
Run Code Online (Sandbox Code Playgroud)
演示。