c++ - const char指针模板特化

标签 c++ template-specialization string-literals

我有这段代码:

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调用相同的函数。为什么会这样呢?而且我可以为const char *和字符串文字编写实际的模板特化,因为上面的感觉像是一种技巧-不是大问题,但仍然如此。

最佳答案

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

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的每个不同的字符串,您都会获得一个单独的实例化)。

关于c++ - const char指针模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63024283/

相关文章:

c++ - FillConsoleOutputCharacterW() C++ 错误

c++ - 运行时系统如何在已编译的二进制文件上支持 "GC"?

c++ - 函数模板特化格式

c++ - 编译器错误 C2766: "explicit specialization; ' specialization' has already been defined"when using boost::disable_if

typescript - 如何在 TypeScript 的字符串文字中省略字符串

c - 指针初始化字符串文字

c++ - 将字符串 vector 排序为日期 "yyyymmdd"

c++ - Gemfire 从 cqEvent 获取错误

c++ - 模板特化/初始化和命名空间?

c - C中的字符串常量和字符串文字有什么区别?