我有以下枚举器:
enum class VariableType
{
Basic,
Vector2,
Vector3,
Vector4
};
和3个矢量类模板:Vector2,Vector3和Vector4。
我正在寻找一个用于通过在模板参数中传递数据类型来初始化VariableType变量的函数。
例如:
auto type1 = GetVariableType<float>::type; // type1 = VariableType::Basic
auto type2 = GetVariableType<Vector2<float> >::type; // type1 = VariableType::Vector2
我想到了用不同的模板两次定义GetVariableType的想法,但是当我编写第二个定义(std :: enable_if_t :: value>)时,代码没有编译。
template<typename T, typename = std::enable_if_t<IsBasicType<T>::value>>
struct GetVariableType
{
static const VariableType type = VariableType::Basic;
};
template<typename T, typename = std::enable_if_t<IsVector2Type<T>::value>>
struct GetVariableType
{
static const VariableType type = VariableType::Vector2;
};
有什么想法应该区分这些定义吗?
答案 0 :(得分:0)
不确定,但在我看来您正在寻找类似的东西
template<typename T>
struct GetVariableType
{ static constexpr VariableType type = VariableType::Basic; };
template<typename T>
struct GetVariableType<Vector2<T>>
{ static constexpr VariableType type = VariableType::Vector2; };
template<typename T>
struct GetVariableType<Vector3<T>>
{ static constexpr VariableType type = VariableType::Vector3; };
template<typename T>
struct GetVariableType<Vector4<T>>
{ static constexpr VariableType type = VariableType::Vector4; };
仅使用模板特化。
建议不要使用主题:避免为变量使用名称type
。
在类型特征标准库中,标识符type
通常用于(通过using
或typedef
来定义类型,而不是变量。
答案 1 :(得分:0)
如果您希望它使用变量(如模板的名称所示)而不是类型,则可以:
template<typename T> VariableType GetVariableType (T) {return VariableType::Basic; };
template<typename T> VariableType GetVariableType (Vector2 <T>) { return VariableType::Vector2; };
template<typename T> VariableType GetVariableType (Vector3 <T>) { return VariableType::Vector3; };
template<typename T> VariableType GetVariableType (Vector4 <T>) { return VariableType::Vector4; };
然后您可以做(例如):
float f = 0;
auto type1 = GetVariableType (f);
std::cout << (int) type1 << '\n';
Vector2 <float> v2;
auto type2 = GetVariableType (v2);
std::cout << (int) type2 << '\n';
输出:
0
1