c++ - 在编译时迭代检查函数是否存在

标签 c++ templates sfinae boost-serialization

我有一个关于我现在面临的问题的问题。 在 C++ 中,我创建了一个帮助程序,能够检测给定模板方法的模板参数是否实现了 serialize。方法(提升序列化实现)。 该助手可以完美地处理我可以使用的大多数类,但我想按如下方式扩展其功能。

假设我有一个 Foo具有序列化方法的类。 我希望我可以将任何嵌套支持的容器传递给它 vector<list<array<Foo,8>>> ,鉴于 vector , listarray提供 serialize方法。

我如何迭代地深入包含的类型,直至未实现 value_type 的类型成员(member)?

提前致谢

这里是我目前的解决方案:

namespace check
{
///A set of classes and struct to be sure the serialised object is either trivial or implementing custom serialize
template <class Type, class Archive, typename = typename std::enable_if<std::is_class<Type>::value>::type>
class is_boost_serializable
{
 private:
  struct TypeOverloader {
    void serialize(Archive& ar, const unsigned int version) {}
  };
  struct TypeExt : public Type, public TypeOverloader {
  };
  template <typename T, T t>
  class DeductionHelper
  {
  };

  class True
  {
    char m;
  };
  class False
  {
    True m[2];
  };

  template <typename TestType>
  static False deduce(TestType*, DeductionHelper<void (TypeOverloader::*)(), &TestType::serialize>* = 0);
  static True deduce(...);

 public:
  static const bool value = (sizeof(True) == sizeof(deduce((TypeExt*)(0))));
};
} // namespace check

最佳答案

#include <utility>
#include <type_traits>

template <typename...>
using void_t = void;

template <typename Type, typename Archive, typename = void_t<>>
struct is_boost_serializable : std::false_type {};

template <typename Type, typename Archive>
struct is_boost_serializable<Type, Archive,
    void_t<decltype(std::declval<Type&>().serialize(std::declval<Archive&>(), 0))>>
    : std::true_type {};

template <typename Type, typename Archive, typename = void_t<>>
struct nested_is_boost_serializable
    : is_boost_serializable<Type, Archive> {};

template <typename Type, typename Archive>
struct nested_is_boost_serializable<Type, Archive, void_t<typename Type::value_type>>
    : nested_is_boost_serializable<typename Type::value_type, Archive> {};

DEMO

关于c++ - 在编译时迭代检查函数是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52153932/

相关文章:

C++17,为什么自动非类型模板参数不能与 SFINAE 一起使用

c++ - 检查一个类是否有复制构造函数?返回 true 或 false

c++ - VC++ express,我该如何解决这个错误?

c++ - 成员函数的部分特化

c++ - 越界访问数组是否被视为违反类型安全或违反内存安全?

c++ - 使用 temp 模拟返回类型的类型推导。带转换运算符的代理

c++ - 基于不同枚举值的类成员重载(或特化)

c++ - SFINAE 可以检测到私有(private)访问违规吗?

c++ - 添加 std::pair 和 + 运算符

c++ - STL 容器迭代器的模板特化?