[英]how can I get this function template to work reguardless of whether I pass a string literal or a string object?
[英]Pass string literal to template function
我尝试将模板 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* 而不是数组? 如果我专注于 arrays,我需要为每个数组大小分配一个吗?
此外,通用模板 function 捕获 f("HELLO"):
template<typename T>
void f(T&& k) { /* Definition... */ }
它会为我需要的每个数组大小创建一个专门化,还是会以某种方式将字符串文字转换为“const char*”?
字符串文字不是const char*
。 字符串文字的类型为const char[N]
,其中N
是字符数加上 null 终止符。 这意味着当您调用 function 时, T
被推断为const char[6]
,它与任何专业化都不匹配,因此使用主模板。 由于您尚未定义主模板,因此会收到有关缺少定义的 linker 错误。
您可以通过使用添加 function 的重载来处理 char arrays 和字符串文字
template<std::size_t N> void f(const char (&arr)[N]) { stuff; }
是的,它会为每个大小的数组戳出一个 function,但这只是一点点额外的编译时间,你只需要写一次主体。
您还应该阅读Why Not Specialize Function Templates? . 在文章中详细说明了为什么 function 模板特化并不总是按您希望的那样工作,并且它们不参与重载决议。 通常你应该超载而不是专门化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.