将字符串文字传递给模板函数
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
是字符数加上null终止符。这意味着,当您调用函数T
时,会将其推导为const char[6]
,它与任何专业化都不匹配,因此使用主模板。由于您尚未定义主模板,因此会收到关于缺少定义的链接器错误。
您可以使用添加函数的重载来处理字符数组和字符串文字
template<std::size_t N> void f(const char (&arr)[N]) { stuff; }
是的,它会为每个大小的数组戳出一个函数,但这只是一点额外的编译时间,你只需要写一次正文。
您还应该阅读《为什么不专门化函数模板?》?。在这篇文章中,它详细说明了为什么函数模板专业化并不总是像你希望的那样工作,并且它们没有参与过载解决。一般来说,你应该超负荷而不是专门化。
相关文章:
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 如何从void函数输出字符串
- 使用用户定义函数的字符串反转
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- 在c++构造函数中使用随机字符串生成器
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- C++:如何使函数只返回作为列表一部分的字符串
- 如何在C++中的同一函数中使用字符串和双精度
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- 使用自定义比较函数使用std::sort()对矢量字符串进行排序时出现问题
- 一个函数,用于查找字符串1包含字符串2 c++的次数
- 对函数 PlaySound 使用字符串变量
- 具有多个模板的模板函数,用于特定数据类型(如字符串)?
- 字符串化递归的"std::vector<std::vector<...>>"而不使用部分模板函数专用化
- Visual c ++,使用字符串引用/指针调用 dll 函数
- 构造函数字符串参数未设置窗口标题
- C++默认构造函数:字符串参数与字符串参数()
- 使用函数C++字符串输入
- c++模板函数字符串类型不匹配