return 类型的方法模板特化

method template specialization by return type

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

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

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

};

我怎样才能做到这一点?

您不能在 class 范围内专攻。根据C++标准,

14.7.3/2 An explicit specialization shall be declared in a namespace enclosing the specialized template.

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

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

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

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