c++ - 为什么这个简单的 enable_if 不起作用?

标签 c++ templates

我在使用 enable_if 构造时遇到了问题,我已设法将其简化为一段非常简单的失败代码:

template <typename Enable, typename...Args>                                 
struct Get;                                                     

template <typename FirstArg, typename... OtherArgs>                       
struct Get<typename std::enable_if<true>::type, FirstArg, OtherArgs...>
{                                                                               
    using type = FirstArg;                                                          
};                                                                              

( Live example )

上面的代码是一些有用的代码的精简版本,但是为了这个问题,我更感兴趣的是为什么这行不通,而不是它是否有效理想或做任何有用的事情。元函数 Get 应该 接受传递给它的第一个类型,并且基于某些条件(在这种情况下总是正确的,因为我没有构造它何时是不) 返回它。

希望第一个参数解析为 enable_if 条件,应该完全抽象。

当我尝试运行它时(参见实际示例)它会产生

error: ‘type’ in ‘struct Get’ does not name a type using T = typename Get::type

为什么?

最佳答案

您编写的专业只有在有人通过 void 时才会生效作为 Get 的第一个参数.

在您的示例代码中,您传递了 int .所以特化不适用。

模板定义和特化中类型的名称没有任何联系,只是它们在 Get<blah, blah, blah> 中的位置。 .它是脱离主要定义的模式匹配。

int main() {
  using T = Get<void, int>::type;
}

关于c++ - 为什么这个简单的 enable_if 不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26446580/

相关文章:

templates - C++ 模板别名的等价性

模板类中的 C++ 模板 static const 成员变量

c++ - 模板值的公共(public)访问

c++ - 摆脱 QTableWidgetItem 中的单元格小部件

c++ - 如何使用 "Tool Tips"捕获屏幕?

c++ - 在 C++ 中使用递归方法时双重释放或损坏 (fasttop)

html - 在具有空格的对象的 django 模板中创建超链接

c++ - 获取指向数组末尾的指针

c++ - 从构造函数中捕获异常而不隐藏 try block 中的对象

C++虚方法问题