【问题标题】:method template specialization by return type返回类型的方法模板特化
【发布时间】:2015-05-23 05:00:02
【问题描述】:

我有一个带有模板方法的类,它的参数定义了返回类型。其他一切的默认构造函数都可以,但是对于 bool,我希望该方法返回 true。我正在尝试将其专门化为以下代码,但这无法编译。

class Foo {
    template <class T>
    T method() {
        ...
        return T();
    }

    template<>
    bool method() {
       ...
       return true;
    }

};

我怎样才能做到这一点?

【问题讨论】:

    标签: c++ templates template-specialization


    【解决方案1】:

    你不能在一个类范围内进行专业化。根据 C++ 标准,

    14.7.3/2 应在包含专门化模板的命名空间中声明显式专门化。

    因此,您应该在命名空间范围内专门化模板成员函数,

    template<> // this should be outside the primary template class definition
    bool Foo::method() {
        return true;
    }
    

    【讨论】:

    • 您能解释一下为什么会有所不同吗?
    • @s.bandara 这些是规则。至于为什么会这样,我真的不知道,这就是正式定义语言时的决定。编译器抱怨:error: explicit specialization in non-namespace scope 'class Foo'
    【解决方案2】:

    您可以使用 SFINAE 来达到预期的效果,这在技术上将“专业化”(这是不可能的,正如其他答案所解释的那样)变成了过载:

    template <class T>
    typename std::enable_if<
        ! std::is_same< T, bool >::value,
        T
    >::type
    method() {
        ...
        return T();
    }
    
    template <class T>
    typename std::enable_if<
        std::is_same< T, bool >::value,
        T
    >::type
    method() {
        ...
        return true;
    }
    

    上面是C++11,C++14你甚至可以用std::enable_if_t来缩短。

    Live example

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多