专用于const char *
的模板是否也会抓住char *
?
例如:
template <typename T> class Foo { /* ... */ };
template <> class Foo<const char *> { /* ... */ };
Foo<char *>
会引用通用模板还是专用模板?
答案 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>
。