【问题标题】:Will a template specialized for const char * accept char * as well?专门用于 const char * 的模板是否也接受 char *?
【发布时间】:2015-01-24 01:19:32
【问题描述】:

专用于const char * 的模板是否也会捕获char *

例如:

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

Foo&lt;char *&gt; 是指通用模板还是专用模板?

【问题讨论】:

    标签: c++ templates constants template-specialization


    【解决方案1】:

    模板类和函数仅与 exact 匹配匹配,因此在您的情况下,Foo&lt;char*&gt; 将引用泛型,因为char*const char* 是不同的类型。这对于函数来说更加令人困惑,因为有时会将引用添加到类型中:const char*&amp;

    制作一个接受指针变体的类模板有点复杂,但通常或多或少像这样工作:

    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&lt;T&gt;

    【讨论】:

    • 那么我是否必须为每种可能的等效类型创建一个专业化?
    • @Matt:不,您可以使用部分特化来处理多种类型。在泛型中添加第二个模板参数 typename = void,然后在部分特化中添加 typename std::enable_if&lt;std::is_same&lt;T, char*&gt;::value || std::is_same&lt;T, const char*&gt;::value&gt;::type
    • 实际上打印的是"B"。你的意思是让thing 变成char *
    • @T.C.:不,我真的认为它会与引用绑定:/我会想到另一个例子
    • 在这里的可转换性可能比is_same链更好。
    猜你喜欢
    • 2014-06-27
    • 2012-07-21
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2012-07-30
    • 2013-04-09
    • 1970-01-01
    • 2010-09-11
    相关资源
    最近更新 更多