将字符串文字传递给模板函数
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?。在文章中,它详细说明了为什么函数模板特化并不总是按您希望的那样工作,并且它们不参与重载决策。通常你应该重载而不是专门化。
我尝试为几种类型专门化一个模板函数,其中之一是 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?。在文章中,它详细说明了为什么函数模板特化并不总是按您希望的那样工作,并且它们不参与重载决策。通常你应该重载而不是专门化。