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

时间:2014-10-19 02:09:12

标签: 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条件,应该完全抽象。

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

  

错误:'struct Get'中的'type'没有使用T =命名类型   typename Get :: type

为什么?

1 个答案:

答案 0 :(得分:1)

如果有人将void作为Get的第一个参数传递,那么您编写的专业化只会启动。

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

模板定义和专业化中类型的名称没有连接,只是它们在Get<blah, blah, blah>中的位置。它是主要定义的模式匹配。

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