基于 SFINAE 的模板方法专业化

SFINAE-based template method specialization

我有一个模板 class 和一些方法,比方说,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淘汰了。

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

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

我哪里错了?

要应用 SFINAE,标识符必须是模板并且必须涉及替换。

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

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