Скажем, я пишу функцию для печати длины строки:
template <size_t N>
void foo(const char (&s)[N]) {
std::cout << "array, size=" << N-1 << std::endl;
}
foo("hello") // prints array, size=5
Теперь я хочу расширить foo
для поддержки не-массивов:
void foo(const char* s) {
std::cout << "raw, size=" << strlen(s) << std::endl;
}
Но оказывается, что это нарушает мое первоначальное предполагаемое использование:
foo("hello") // now prints raw, size=5
Почему? Разве это не требовало бы преобразования между массивами и указателями, в то время как шаблон был бы точным совпадением? Есть ли способ гарантировать, что моя функция массива будет вызвана?