映射枚举值为C 中的模板参数
Map enum value to template argument in C++
我有一个带有几个成员的枚举类。枚举的目的是在运行时编码原始类型(例如int,long,float,...),以便例如在数据库中存储此信息。同时,也存在许多模板来处理原始类型的类。
问题:我想从这种模板类创建一个对象,给定一个不是常数的枚举值。这可以比在枚举值上创建长长的开关以更清洁,更可扩展的方式(或与eNum值(int)对type的动态映射回答中所提出的映射进行基本相同)?<<<<<<<<<<<</p>
这是我一直在尝试希望模板类型推理可以起作用的东西,但是它无法编译(例如,可以在此处检查:http://rextester.com/vsxr46052):
#include <iostream>
enum class Enum {
Int,
Long
};
template<Enum T>
struct EnumToPrimitiveType;
template<>
struct EnumToPrimitiveType<Enum::Int> {
using type = int;
};
template<>
struct EnumToPrimitiveType<Enum::Long> {
using type = long;
};
template<typename T>
class TemplatedClass
{
public:
TemplatedClass(T init): init{init} {}
void printSize() { std::cout << sizeof(init) << std::endl; }
private:
T init;
};
template<Enum T>
auto makeTemplatedClass(T enumValue) -> TemplatedClass<EnumToPrimitiveType<T>::type>
{
TemplatedClass<EnumToPrimitiveType<T>::type> ret(5);
return ret;
}
int main()
{
Enum value{Enum::Int};
auto tmp = makeTemplatedClass(value);
tmp.printSize();
}
编译错误:
source_file.cpp:36:27: error: expected ‘)’ before ‘enumValue’
auto makeTemplatedClass(T enumValue) -> TemplatedClass<EnumToPrimitiveType<T>::type>
^
source_file.cpp:36:6: warning: variable templates only available with -std=c++14 or -std=gnu++14
auto makeTemplatedClass(T enumValue) -> TemplatedClass<EnumToPrimitiveType<T>::type>
^
source_file.cpp:36:38: error: expected ‘;’ before ‘->’ token
auto makeTemplatedClass(T enumValue) -> TemplatedClass<EnumToPrimitiveType<T>::type>
^
source_file.cpp: In function ‘int main()’:
source_file.cpp:44:16: error: ‘A’ is not a member of ‘Enum’
Enum value{Enum::A};
^
source_file.cpp:45:34: error: missing template arguments before ‘(’ token
auto tmp = makeTemplatedClass(value);
^
我看到的问题:
-
您不能使用
template<Enum T> auto makeTemplatedClass(T enumValue)
,因为T
不是类型。您需要仅使用template<Enum T> auto makeTemplatedClass()
并以不同的方式调用该功能。 -
您需要使用
TemplatedClass<typename EnumToPrimitiveType<T>::type>
而不是TemplatedClass<EnumToPrimitiveType<T>::type>
。这是必要的,因为type
是一种因类型。 -
,除非是
const
或constexpr
。
,您不能将
value
用作模板参数以下程序编译并在我的桌面上构建。
#include <iostream>
enum class Enum {
Int,
Long
};
template<Enum T>
struct EnumToPrimitiveType;
template<>
struct EnumToPrimitiveType<Enum::Int> {
using type = int;
};
template<>
struct EnumToPrimitiveType<Enum::Long> {
using type = long;
};
template<typename T>
class TemplatedClass
{
public:
TemplatedClass(T init): init{init} {}
void printSize() { std::cout << sizeof(init) << std::endl; }
private:
T init;
};
template<Enum T>
auto makeTemplatedClass() -> TemplatedClass<typename EnumToPrimitiveType<T>::type>
{
TemplatedClass<typename EnumToPrimitiveType<T>::type> ret(5);
return ret;
}
int main()
{
Enum const value{Enum::Int};
auto tmp = makeTemplatedClass<value>();
tmp.printSize();
}
相关文章:
- 有没有办法使用类的私有枚举值作为模板参数?
- 从可变参数创建枚举?
- 在运行时使用枚举器值作为模板函数的模板参数的元程序
- 基于枚举参数调用专用模板方法
- 枚举作为模板参数
- 如何将枚举类作为类模板参数包含在内?
- 如何从枚举类值中指定模板函数参数中的数组大小?
- 是否可以使用泛型枚举类型作为函数的参数?
- C++ - 使用模板类中的枚举而不带模板参数
- 将函数参数限制为某些枚举值
- C++ 成员函数的多个定义,基于枚举模板参数
- 如何根据枚举参数返回其他类型
- 枚举类别和布尔模板参数的放松constexpr要求
- C++ 在C++中通过引用将枚举作为默认参数传递时出错
- 不能将类实例化为 LHS 值,并将限定枚举作为参数 (C++ VS2015)
- 是否可以使用 static_cast 从可变参数枚举创建 boost::mpl::list_c
- 枚举作为基类的模板参数总是会因未解决的错误而失败
- 在模板参数内向前声明枚举类
- C++运行时从编译时已知集/枚举中选择模板非类型参数
- 有没有一种方法可以在基于枚举的可变参数模板函数之间进行选择,这比将函数包装在结构中更简单