带有`const char *`特化的pass-by-reference模板函数

时间:2016-08-03 15:21:56

标签: c++ templates template-specialization

我有一个模板功能:

template<typename T>
void foo(T const & t);

该功能的一些特殊化:

template<> void foo<int>(int const & t) {
  cout << t << endl;
}

template<> void foo<const char *>(const char * const & t) {
  cout << t << endl;
}

我想用这个函数调用一些方法:

foo(3);
foo("Hello, world.");

但我无法弄清楚如何制定模板,以便模板类型推导得到intconst char *的文字。如果我这样做,那么我得到undefined reference to void foo<char [14]>(char const [14] &)。我尝试重铸这样的模板:

template<typename T>
void foo(T t);

template<> void foo<int>(int t) { ... }
template<> void foo<const char *>(const char * t) { ... }

有效,但当然现在我得到了按值调用的语义,要求我用作模板参数的任何类类型都有一个复制构造函数。

是否无法编写具有const char *专业化功能的pass-by-reference模板函数?

1 个答案:

答案 0 :(得分:4)

此:

foo("Hello, world.");

不会致电foo<const char*>。它会调用foo<char[14]>,因为foo需要T const&。您的专业化没有被调用,因为它与模板的类型不同。

那就是说,不要专攻。过载:

template<typename T>
void foo(T const& );

void foo(int const& );

void foo(char const* );

这种方式更容易推理,更有可能做你真正想要的事情。