基于SFINAE的模板方法专业化

时间:2016-10-04 22:21:02

标签: c++ sfinae

我有一个模板类,有一些方法,比如foo。我想为所有POD类型指定此方法的默认行为,并为其他类型引入单独的特化。 (真正的问题是更复杂,但这是一个MWE。)我试图用通常的方式与SFINAE一起做。

template<typename T>
class C {
public:
    void foo(T t);
};

template<typename T>
typename std::enable_if<
        std::is_pod<T>::value,
        void>::type
C<T>::foo(T t) {
    // do something
}

即使使用这段代码(即没有制作任何C的实例),我也有错误:

prototype for ‘typename std::enable_if<std::is_pod<_Tp>::value, void>::type C<T>::foo(T)’ does not match any in class ‘C<T>’

这对我来说似乎很奇怪,因为两种方法类型都是void,或者第二种方法类型被SFINAE淘汰。

更奇怪的是,如果我用enable_if替换false中的条件,我收到的错误表明SFINAE根本不起作用:

error: ‘type’ in ‘struct std::enable_if<false, void>’ does not name a type

我哪里错了?

1 个答案:

答案 0 :(得分:1)

对于SFINAE申请,标识符必须是模板,并且必须涉及替换。

第一种情况失败,因为foo不是模板。

第二种情况由于同样的原因而失败,因为不涉及替代。