繁体   English   中英

将字符串文字传递给模板 function

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM