簡體   English   中英

將枚舉值映射到C ++中的模板參數

[英]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);
                                  ^

我看到的問題:

  1. 由於T不是類型,因此不能使用template<Enum T> auto makeTemplatedClass(T enumValue) 您只需要使用template<Enum T> auto makeTemplatedClass()並以不同的方式調用該函數。

  2. 您需要使用TemplatedClass<typename EnumToPrimitiveType<T>::type>而不是TemplatedClass<EnumToPrimitiveType<T>::type> 這是必需的,因為type是從屬類型。

  3. 除非它是constconstexpr否則不能將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM