将字符串文字传递给模板函数

Pass string literal to template function

我尝试为几种类型专门化一个模板函数,其中之一是 const char*。

template<typename T = const char*>
void f(T&&);

template<>
void f<int>(int&& k) { std::cout << "Now in int fcn (" << k << ")!\n"; }

template<>
void f<const char*>(const char* && k) { std::cout << "Now in cc* fcn (" << k << ")!\n"; }

int main() {
  f<int>(5);
  f("HELLO");

  return 0;
}

但是当我执行 f("HELLO") 时,出现以下错误:

main.cpp:(.text+0x32): undefined reference to `void f<char const (&) [6]>(char const (&) [6])'

如何让它将“HELLO”解释为 const char* 而不是数组?如果我专攻数组,我需要一个对应每个数组大小的数组吗?

此外,通用模板函数捕获 f("HELLO"):

template<typename T>
void f(T&& k) { /* Definition... */ }

它会为我需要的每个数组大小创建一个专门化,还是会以某种方式将字符串文字转换为“const char*”?

字符串文字不是 const char*。字符串文字的类型为 const char[N],其中 N 是字符数加上空终止符。这意味着当您调用函数时,T 被推导为 const char[6],它不匹配任何专业化,因此使用主模板。由于您尚未定义主模板,因此您会收到有关缺少定义的链接器错误。

您可以使用

添加函数重载以处理字符数组和字符串文字
template<std::size_t N> void f(const char (&arr)[N]) { stuff; }

是的,它会为每个大小的数组戳出一个函数,但这只是一点点额外的编译时间,你只需要写一次主体。


您还应该阅读 Why Not Specialize Function Templates?。在文章中,它详细说明了为什么函数模板特化并不总是按您希望的那样工作,并且它们不参与重载决策。通常你应该重载而不是专门化。