【问题标题】:const char pointer template specializationconst char 指针模板特化
【发布时间】:2020-11-11 09:50:51
【问题描述】:

我有这段代码:

template<typename T>
void test(const T& p);

我想用 const char* 专门化模板来处理字符串文字。所以我补充说:

template<>
void test(const char* const& p) { std::cout << "test2\n"; }

但事实证明它不适用于调用:

test("abc");

我知道“abc”在技术上不是 const char 指针,所以我应该这样写:

template<size_t N>
void test(const char (&p)[N]) { std::cout << "test3\n"; }

但我不想区分字符串文字和 const char*,例如:

const char* s = "abc";
test(s); test("abc"); // I want it to call the same function

所以我发现如果你这样写“模板专业化”(实际上只是重载):

void test(const char* const& p) { std::cout << "test4\n"; }

它可以工作并且 test("abc") 和 test(s) 调用相同的函数。为什么会这样?我可以为 const char* 和字符串文字编写实际的模板特化吗,因为上面感觉像是一个 hack - 不是大的,但仍然。

【问题讨论】:

  • @TedLyngmo 我以为这是个玩笑,因为你改变了 std::cout
  • @HubertObrzut 我只是草率地阅读(和打字)。对不起:)

标签: c++ template-specialization string-literals


【解决方案1】:

您可以添加另一个模板,如下所示:

template<typename T>
void test(const T* p);

然后你可以这样做:

template<>
void test(const char* p) { std::cout << "test2\n"; }

但是,我认为只添加一个普通的非模板函数重载来处理 const char * 案例没有任何问题:

void test(const char* p) { std::cout << "test4\n"; }

事实上,我更喜欢它(因为否则你会为传递给test 的每个不同字符串获得一个单独的实例化)。

【讨论】:

  • 好吧,指针模板特化是有道理的——现在感觉很明显,但我过于关注这些引用,但出于好奇,为什么没有选择具有相同签名的模板特化和重载相同的情况,因为 test2 和 test4 是“相同”的功能 - 一个只是模板专业化与 template?
  • 对不起,我不明白这个问题。你的意思是如果你两者都有会发生什么?模棱两可的定义,猜测。
  • 不,我的意思是如果你有template&lt;&gt; void test(const char* const&amp; p) {...}test("abc") 将无法工作,但如果你只有void test(const char* const&amp; p) {...}test("abc") 将工作。
  • 您实际上在模板版本中遇到了一个链接器错误,“undefined reference to `void test(char const (&) [4])'”,这给了你一点一个线索。
  • @HubertObrzut void test(const char* const&amp; p)const char* 变量进行引用,但"abc" 不是const char* 变量,它是const char[] 数组,所以p 不能引用它。不过,void test(const char* p) 很乐意接受"abc",这要感谢数组衰减
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-05
  • 2021-02-28
  • 1970-01-01
  • 1970-01-01
  • 2016-06-10
相关资源
最近更新 更多