模板结构的多个声明,用于获取枚举,描述模板类型

时间:2019-04-19 17:41:49

标签: c++ templates traits

我有以下枚举器:

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;
};

有什么想法应该区分这些定义吗?

2 个答案:

答案 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通常用于(通过usingtypedef来定义类型,而不是变量。

答案 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

Live demo