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

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/

10-11 18:25