【发布时间】: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