非类型模板参数和标准::enable_if_t
Non-type template parameter and std::enable_if_t
我正在尝试制作一些持久性的东西,我有一个这样的结构:
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 中不存在,但如果enable_if_t
已经完成了它的工作,那么这种serialize_custom
专用化也不应该存在。我已经在此代码之外测试了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));
}
...
相关文章:
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何删除peer if else分支中的冗长句子
- 我似乎对if/else的基本语句有问题:/
- if数组上的随机数
- 将按位if条件转换为普通if条件
- If语句在c++中被忽略
- 比较if语句中的数组值和int值
- 使用if-else将数字转换为单词
- 为什么简单的算术减法在"if"条件下不起作用?
- 检查一个类型是否直接派生自"enable if"上下文中的另一个类型(是其子类型)
- SFINAE with boost enable if