我正在学习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;
};
答案 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;
};
,其他模板也是如此。