根据特征专门化模板类

Pat*_*ght 3 c++ templates template-specialization c++17

我试图弄清楚如何根据模板的结果来特殊模板类。例如,假设我有以下基本模板类:

enum class BasicType
{
    UNKNOWN,
    PRIMITIVE,
    OBJECT
};

template <typename T>
struct traits
{
    static constexpr BasicType type = BasicType::UNKNOWN;
};
Run Code Online (Sandbox Code Playgroud)

我希望能够创建特征的专门化,例如,对于 std::is_integral_v 为 true 的任何类型。然后是另一个专业,其中另一个特征是正确的。

我尝试过这样的事情

template <typename T>
struct traits<std::enable_if_t<std::is_integral_v<T>, T>>
{
    static constexpr BasicType type = BasicType::PRIMITIVE;
};
Run Code Online (Sandbox Code Playgroud)

但这行不通。

Tim*_*imo 7

你已经很接近了,但是像这样使用enable_if的问题是它会阻止类型推导。基本上,编译器无法匹配您的模板专业化。不过,您可以做的是将enable_if部分移动到您旁边的第二个模板参数,T以便可以推断出:

template <typename T, typename = void>
struct traits
{
    static constexpr BasicType type = BasicType::UNKNOWN;
};

template <typename T>
struct traits<T, std::enable_if_t<std::is_integral_v<T>>>
{
    static constexpr BasicType type = BasicType::PRIMITIVE;
};
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为T不再隐藏在另一个模板后面。编译器仍然无法T从推导std::enable_if_t<std::is_integral_v<T>>,但是因为您T在这里还指定了 direclty: struct traits<T, ...>,所以编译器可以T通过这种方式推导,这足以匹配您的专业化。

例子