我试图做一些持久性的东西,我有这样的结构:
struct EntityPersistence {
template <typename Archive>
void persist(Archive &ar, Entity &)
{
}
};
然后,在我的实体类我有这样的事情:
static const EntityPersistence entityPersistence;
PERSISTENCE_CUSTOM(Entity, entityPersistence)
此宏确实是这样的:
#define PERSISTENCE_CUSTOM(Base, customPersistence) \
SERIALIZE(Base, customPersistence)
继链...(这里是最重要的事情来)
#define SERIALIZE(Base, customPersistence)
template <class Archive>
void serialize(Archive& ar)
{
serialize_custom(ar);
}
template <class Archive, class Base, decltype(customPersistence) &persistence = customPersistence>
std::enable_if_t<std::is_base_of<cereal::InputArchive<Archive>, Archive>::value && has_deserialize<std::remove_const<decltype(customPersistence)>::type, Archive&, Base&>() == true, void>
serialize_custom(Archive &ar)
{
persistence.deserialize(ar, const_cast<Base&>(*this));
}
缺少一些代码来检查其功能是在持久性结构来实现,以便在编译时分支执行代码:
template<class> struct sfinae_true : std::true_type{};
template<class T, class A0, class A1>
static auto test_deserialize(int)
-> sfinae_true<decltype(std::declval<T>().deserialize(std::declval<A0>(), std::declval<A1>()))>;
template<class, class A0, class A1>
static auto test_deserialize(long) -> std::false_type;
template<class T, class A0, class A1>
static auto test_persist(int)
-> sfinae_true<decltype(std::declval<T>().persist(std::declval<A0>(), std::declval<A1>()))>;
template<class, class A0, class A1>
static auto test_persist(long) -> std::false_type;
template<class T, class Arg1, class Arg2>
struct has_deserialize : decltype(::detail::test_deserialize<T, Arg1, Arg2>(0)){};
template<class T, class Arg1, class Arg2>
struct has_persist : decltype(::detail::test_persist<T, Arg1, Arg2>(0)){};
有问题的错误:
In member function ‘std::enable_if_t<(std::is_base_of<cereal::InputArchive<Archive>, Archive>::value && (has_deserialize<EntityPersistence, Archive&, Entity&>() == true)), void> Entity::serialize_custom(Archive&)’:
error: ‘const struct EntityPersistence’ has no member named ‘deserialize’
persistence.deserialize(ar, const_cast<Base&>(*this)); \
^
deserialize
功能不存在于EntityPersistence但这serialize_custom
专业化应该也不如果enable_if_t
会做自己的工作。我已经测试has_deserialize
结构这个代码之外,它完美的作品。莫非这事做与serialize_custom功能的非类型模板参数?也许这是enable_if_t之前评估?
提前致谢
不知道我有关于检查persistence
(serialize_custom()
的模板参数),而不是customPersistence
(不是serialize_custom()
的模板参数足以什么元素来尝试,但...?
我的意思是......怎么样,如下所示?
template <class Archive, class Base,
decltype(customPersistence) & persistence = customPersistence>
std::enable_if_t<std::is_base_of<cereal::InputArchive<Archive>, Archive>::value
&& has_deserialize<std::remove_const<decltype(persistence)>::type,
Archive&, Base&>() == true> //^^^^^^^^^^^
serialize_custom(Archive &ar)
{
persistence.deserialize(ar, const_cast<Base&>(*this));
}
我终于解决了这个问题中间人方法(如果有人有兴趣):
template <class Archive>
void serialize(Archive& ar)
{
serialize_custom_helper(ar);
}
template <class Archive, decltype(customPersistence)& persistence = customPersistence> \
void serialize_custom_helper(Archive& ar)
{
serialize_custom(ar, persistence);
}
template <class Archive, class Base, class P>
std::enable_if_t<std::is_base_of<cereal::InputArchive<Archive>, Archive>::value && has_deserialize2<P, Archive&, Base&>() == true, void>
serialize_custom(Archive &ar, P& persistence)
{
persistence.deserialize(ar, const_cast<Base&>(*this));
}
...