SFINAE和衰变不能一起使用。为什么?

时间:2020-07-31 17:43:09

标签: c++ templates sfinae

我正在学习C ++中的元编程。我想根据传递的类型来自动检测opengl类型的id。我的代码通过了decltype(array),它变成了float*。如果我使用GLType<float>::type可以正常工作,但是GLType<float*>::type失败,并显示“未知成员类型”错误。我认为std::is_same_v<std::decay_t<T>, float>>here中对任何true_type的求值float*, float[], const float, etc..

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

template <typename T>
struct GLType<T, std::enable_if_t<std::is_same_v<std::decay_t<T>, float>>> {
    const static constexpr int type = GL_FLOAT;
};

template <typename T>
struct GLType<T, std::enable_if_t<std::is_same_v<std::decay_t<T>, double>>> {
    const static constexpr int type = GL_DOUBLE;
};

1 个答案:

答案 0 :(得分:3)

std::decay_t不会从类型中删除指针。如果要这样做,则需要使用std::remove_pointer_t,如下所示:

template <typename T>
struct GLType<T, std::enable_if_t<std::is_same_v<std::remove_pointer_t<std::decay_t<T>>, float>>> {
                                             //  ^^^^^^^^^^^^^^^^^^^^^  add this   
 const static constexpr int type = GL_FLOAT;
};

,其他模板也是如此。

相关问题