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

Pass string literal to template function

本文关键字:函数 字符串 文字      更新时间:2024-09-27

我试图为几种类型专门化一个模板函数,其中之一是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是字符数加上null终止符。这意味着,当您调用函数T时,会将其推导为const char[6],它与任何专业化都不匹配,因此使用主模板。由于您尚未定义主模板,因此会收到关于缺少定义的链接器错误。

您可以使用添加函数的重载来处理字符数组和字符串文字

template<std::size_t N> void f(const char (&arr)[N]) { stuff; }

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


您还应该阅读《为什么不专门化函数模板?》?。在这篇文章中,它详细说明了为什么函数模板专业化并不总是像你希望的那样工作,并且它们没有参与过载解决。一般来说,你应该超负荷而不是专门化。