2017-03-08 80 views
0

共享序列化功能讓想我有類似:穀物:跨枚舉

enum t_color { BLUE=0,RED,GREEN}; 
vector<string> TAG_color={"BLUE", "RED", "GREEN"}; 

enum t_colores { AZUL=0,ROJO,VERDE}; 
vector<string> TAG_colores={"AZUL", "ROJO", "VERDE"}; 

我想用(穀物)共同save_minimal,如:

template <class Archive,typename T > inline 
    std::string save_minimal(Archive const &, typename std::enable_if< std::is_enum<T>::value, T >::type const & t) 
    { 
    std::string ret="Unknown"; 
    if (std::is_same<T,t_color>::value) 
    { 
     ret=TAG_color[t]; 
    } 
    else if ( std::is_same<T,t_colores>::value) 
    { 
     ret=TAG_colores[t]; 
    } 
    return ret; 
} 

它編譯,但似乎像麥片一樣無視模板。它只是使用枚舉的「整數」值。

回答

0

沒錯......這是(直接通過而不是穀物)是可行的:

#define SERIALIZE_ENUM(enumname)            \ 
template <class Archive> inline            \ 
std::string save_minimal(Archive const &, t_##enumname const & t)   \ 
{                    \ 
    return std::string(TAG_##enumname[t]);          \ 
}                    \ 
template <class Archive> inline            \ 
void load_minimal(Archive const&, t_##enumname & t,std::string const& value) \ 
{                    \ 
    int a=0;                  \ 
    for (auto const &tag:TAG_##enumname)           \ 
    {                   \ 
    if (tag == value)              \ 
    {                   \ 
     t = static_cast<t_##enumname>(a);          \ 
     return;                 \ 
    }                   \ 
    a++;                  \ 
    }                   \ 

namespace cereal { 
    SERIALIZE_ENUM(color) 
    SERIALIZE_ENUM(colores) 
}