如何让编译器在指针上选择模板的静态数组版本?

sco*_*obi 8 c++ templates

我正在尝试做一些接近这个的事情:

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.有没有办法做到这一点,或者比我正在尝试的更好的选择?

T.C*_*.C. 3

只需通过 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)

演示