【问题标题】:How std::enable_if prevents declaration of member template?std::enable_if 如何防止成员模板的声明?
【发布时间】:2020-11-15 14:41:14
【问题描述】:

Stroustrup C++ 4th Ed Page 796 指出

"如果Enable_if的条件评估为false,则整个函数 它所属的声明被完全忽略。”和“......我们 不要声明任何东西。”。

我还阅读了this suggested thread,其中 SFINAE 仅在模板参数的参数推导中的替换使构造不正确时才有效。

对于这个例子,我试图了解 SFINAE 如何省略 Enable_if<false, T> f0(int x) {}; 构造。

是因为缺少返回类型::type 导致模板在语言方面的结构不正确?

#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() {}

这是因为模板参数格式不正确(没有将::type 分配给nullptr。)

【问题讨论】:

  • “是不是因为缺少返回类型 ::type 使得模板在语言方面的结构不正确?”

标签: c++ class c++11 templates sfinae


【解决方案1】:

我试图了解 SFINAE 如何省略 Enable_if&lt;false, T&gt; f0(int x) {}; 构造。是不是因为缺少返回类型 ::type 使模板在语言方面构造错误?

简短回答:

你需要看看,SFNINAE 基本上是如何从a good c++ book 工作的。例如来自cppreference.com

此规则适用于函数的重载解析 模板:替换明确指定或推导时 模板参数的类型失败,特化是 从重载集中丢弃,而不是导致编译错误。

意思是,你首先需要重载的模板函数!这已在给定的示例代码中实现。

其次,std::enable_if的部分。它检查您提供的条件

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

在编译时,决定是否to activate the part below or not

标准库组件std::enable_if 允许创建一个 为了启用或禁用特定的替换失败 根据编译时评估的条件进行重载

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

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

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


是不是因为缺少返回类型::type使得模板 构建格式错误的语言?

由于上述原因,;不是这个原因!

通过提供这样的模板类型别名

template<bool B, typename T>
using Enable_if = typename std::enable_if<B,T>::type;
//                                            ^^^^^^^ --> type has been mentioned here!

您通过别名类型Enable_if&lt;/*condition*/, T&gt; 提到了::type

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-01-22
    • 2011-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多