一个专门针对const char*的模板是否也接受char*?

3

一个专门针对 const char * 的模板能否也捕捉到 char *

例如:

template <typename T> class Foo { /* ... */ };
template <> class Foo<const char *> { /* ... */ };
< p > Foo<char *> 会引用通用模板还是专用模板?< /p >
1个回答

6
模板类和函数只与完全相同的匹配项匹配,因此在您的情况下,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>


那么我需要为每个可能的等效类型创建一个专业化吗? - Matt
@Matt:不,你可以使用部分特化来处理多个类型。在通用模板中添加第二个模板参数 typename = void,然后在部分特化中添加 typename std::enable_if<std::is_same<T, char*>::value || std::is_same<T, const char*>::value>::type - Collin Dauphinee
1
实际上,它打印了"B"。你是不是想把thing变成一个char * - T.C.
@T.C.:不,我真的以为它会与引用绑定 :/ 那我再想一个例子。 - Mooing Duck
在这里,使用convertible可能比is_same的链式更好。 - Yakk - Adam Nevraumont
@Yakk:完全取决于Matt的用例。我认为他想匹配char*const char*,但不是其他类型。也可能是你的方法。 - Mooing Duck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接