[英]Map enum value to template argument in C++
我有一個由幾個成員組成的枚舉類。 枚舉的目標是在運行時對原始類型(例如int,long,float等)進行編碼,以便可以將這些信息存儲在例如數據庫中。 同時,還存在許多模板化的用於原始類型的類。
問題:給定的枚舉值不是常量,我想從這樣的模板化類創建對象。 與在枚舉值上創建一個長開關(或對枚舉值(int)對類型的動態映射的答案中提出的映射進行基本相同)相比,這是否有任何更清潔,更可擴展的方式呢?
這是我一直在嘗試的一些事情,希望模板類型推斷可以起作用,但是無法編譯(可以在此處進行檢查,例如: 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);
^
我看到的問題:
由於T
不是類型,因此不能使用template<Enum T> auto makeTemplatedClass(T enumValue)
。 您只需要使用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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.