当前位置: 首页 > 知识库问答 >
问题:

STD::ENABLE_IF如何阻止声明成员模板?

宓英哲
2023-03-14

Stroustrup C++第4版第796页指出

“如果enable_if的条件计算为false,则完全忽略它所在的整个函数声明。”和“...我们不申报任何东西。”。

我也读过这个建议的线程,在这个线程中,SFINAE只有在模板参数的参数推导中的替换使构造格式不正确时才起作用。

#include <type_traits>
using namespace std;

template<bool B, typename T>
using Enable_if = typename std::enable_if<B, T>::type;

struct X 
{
   template <class T>
   Enable_if<false, T> f0(int x) {};
   template <class T>
   Enable_if<true, T> f0(int x) {};
};

int main(void)
{
   X xx;
   xx.f0<void>(0);
   return 0;
}
template <typename enable_if<false>::type* = nullptr> 
void f0() {}

共有1个答案

冯嘉荣
2023-03-14

我试图理解SFINAE是如何省略enable_if f0(int x){}; 构造的。是否因为缺少返回类型::type使得模板构造了格式不正确的语言?

简短的回答:不!

你需要看一下,SFNINAE基本上是如何工作的,形成了一本好的C++书。例如,从cppreference.com

template< bool B, class T = void >
//       ^^^^^^^ -----------------------> here!!
struct enable_if;

标准库组件std::enable_if允许创建替换失败,以便根据编译时评估的条件启用或禁用特定重载。

在代码中,对于给定的重载

template <class T>
Enable_if<false, T> f0(int x) {};
//        ^^^^^ ---------------> CONDITION == false

条件是false,因此实际上,在编译器完成编译后,这部分(代码)将不存在。

template<bool B, typename T>
using Enable_if = typename std::enable_if<B,T>::type;
//                                            ^^^^^^^ --> type has been mentioned here!
 类似资料:
  • 我正在构建一些输入检查器,需要为整数和/或双精度设置特定的函数(例如,“iPrime”应该只适用于整数)。 如果我使用作为参数,它工作得很好: 但如果我将其用作模板参数(如上所示)http://en.cppreference.com/w/cpp/types/enable_if ) 那么我有以下错误: 我不知道第二个版本出了什么问题。

  • 我有以下代码: 使用这段代码,我希望第一次调用打印出(因为确实可以转换为,所以应该调用第一个专门化),第二次调用打印出(不能转换为,所以应该调用第二个专门化)。但是,我反而得到了一个编译器错误: prog.cpp:在函数“int main()”中: prog.cpp:5:6:注意:模板参数扣减/替换失败: prog.cpp:27:8:注意:无法推导出模板参数“[Anonymous>” 但是,如果我

  • 在新的反射API中,属性是访问类型上声明的成员(字段、属性、方法等)的正确方法。但是,这些属性不包括从基类继承的成员。 旧的方法返回声明的和继承的成员,但并非在所有平台上都可用,包括。净核心。 如何使用新API获取已声明和继承成员的列表?

  • 我试图将我的应用程序从Java转换为静态编程语言。 我使用了Android Studio内置转换器并修复了它生成的大部分错误。 对于科特林来说,这一次让我很难受: 我得到了这个用Java编写的类,并进行了转换,显然没有任何错误,这有助于我在回收视图中管理项目点击: 在main活动中,转换后在函数中设置如下: IDE给我以下错误: 类型不匹配: 必需:ItemClickSupport。OnItemC

  • 在阅读了诸如sfinae关于在类主体之外定义的成员函数(这不是同一个问题)等问题之后,我仍然没有找到在使用sfinae方法仅使用算术类型启用类时在类声明之外定义成员函数主体的好方法。 在本例中,我得到错误:

  • 请帮帮我,我有两个问题: 我从Apache Kafka json-messages读到(然后我有步骤:反序列化到POJO、筛选器、keyBy...) 使用哪个更好:KeyedProcessFunction(带有状态、计时器、if-else逻辑块)还是Flink CEP模式库? 我可以检查KeyedProcessFunction中的输入序列(检查state,if-else blocks,out.co