专用于const char *的模板是否也会接受char *?

时间:2015-01-24 01:19:32

标签: c++ templates const template-specialization

专用于const char *的模板是否也会抓住char *

例如:

template <typename T> class Foo { /* ... */ };
template <> class Foo<const char *> { /* ... */ };

Foo<char *>会引用通用模板还是专用模板?

1 个答案:

答案 0 :(得分:5)

模板类和函数仅与完全匹配匹配,因此在您的情况下,Foo<char*>将引用泛型,因为char*const char*不同类型。这会使函数更加混乱,因为有时会将引用添加到类型中:const char*&

使一个接受指针变体的类模板有点复杂,但通常或多或少都是这样的:

template <typename T, typename allowed=void> class Foo { /* ... */ };

template <typename T> 
class Foo<T, typename std::enable_if<std::is_same<T, char*>::value || 
                           std::is_same<T, const char*>::value
                           >::type> { /* ... */ };

根据您正在做的事情,您可能还需要std::remove_reference<T>