Cereal:跨枚举的共享序列化功能
Cereal: Shared serialization function across enums
假设我有这样的东西:
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;
}
它可以编译,但似乎谷物忽略了模板。它只使用枚举的 "integer" 值。
是的...这是可行的(但不能直接通过谷物):
#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)
}
假设我有这样的东西:
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;
}
它可以编译,但似乎谷物忽略了模板。它只使用枚举的 "integer" 值。
是的...这是可行的(但不能直接通过谷物):
#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)
}