基于 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
不是模板。
第二种情况由于同样的原因而失败,因为没有涉及替换。
我有一个模板 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
不是模板。
第二种情况由于同样的原因而失败,因为没有涉及替换。