gpt4 book ai didi

c++ - 基于 SFINAE 的模板方法特化

转载 作者:行者123 更新时间:2023-11-28 05:29:23 31 4
gpt4 key购买 nike

我有一个带有一些方法的模板类,比如说,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

我哪里错了?

最佳答案

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

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

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

关于c++ - 基于 SFINAE 的模板方法特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39862646/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com