我遇到了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;
};
上面的代码是一些有用的代码的内容版本,但为了这个问题,我对为什么这个不起作用更感兴趣,而不是无论它是理想的还是有用的。元函数Get
应该采用传递给它的第一个类型,并且基于某些条件(在这种情况下总是如此,因为我没有构建一个不用的情况退还它。
我没有希望第一个参数解析为enable_if
条件,应该完全抽象。
当我尝试运行它时(参见实例)它会产生
错误:'struct Get'中的'type'没有使用T =命名类型 typename Get :: type
为什么?
答案 0 :(得分:1)
如果有人将void
作为Get
的第一个参数传递,那么您编写的专业化只会启动。
在您的示例代码中,您传递了int
。所以专业化不适用。
模板定义和专业化中类型的名称没有连接,只是它们在Get<blah, blah, blah>
中的位置。它是主要定义的模式匹配。
int main() {
using T = Get<void, int>::type;
}