templates - 为什么enable_if不能用于特殊参数?

标签 templates c++11

我正在尝试为整数类型创建部分特化。我的想法是做类似的事情:

#include <type_traits>

template <typename T>
struct Class {
};

template <typename T>
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> {
};

但这会导致以下错误:

error: template parameters not deducible in partial specialization:
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> {
       ^
note: 'T'

如果我使用额外的模板参数,它确实有效:

#include <type_traits>

template <typename T, typename Enable = void>
struct Class {
};

template <typename T>
struct Class<T, typename std::enable_if<std::is_integral<T>::value>::type> {
};

为什么我需要额外的模板参数?

最佳答案

在第一种情况下,您没有专门学习该类(class)。 当你写:

template <typename T>
struct Class<typename std::enable_if<std::is_integral<T>::value, T>::type> {
};

T 仍然是通用模板类型,并且您的编译器会感到困惑。

在第二种情况下,当你写

template <typename T>
struct Class<T, typename std::enable_if<std::is_integral<T>::value>::type> {
};

您正确地专门化了模板参数Enable,并且一切正常。

如果你想专门化第一个,你应该逐个类型地进行,这可能不是你想要的

template <>
struct Class<std::enable_if<std::is_integral<int>::value, int>::type> {
};

关于templates - 为什么enable_if不能用于特殊参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37426873/

相关文章:

c++ - 如何检测 operator[] 是否适用于 Type?

c++ - tr1::mem_fn 和 tr1::bind:常量正确性和重载

c++ - 如何从 C++11 匿名函数内部访问局部变量?

javascript - 如何在 mustache 模板化后检查元素是否存在

c++ - 用于创建方法的可变参数模板的模板特化

c++ - 字符串函数在这里是什么意思

c++ - 返回 const 值以利用 move 语义与防止诸如 (a+b)=c 之类的东西

c++ - 理解 std::thread 语义,工作函数作为类成员

php - 在 php 模板中将对象居中。如何?

c++ - 在模板本身中检索最里面的模板类型