我有这段代码:
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/