我有一个关于我现在面临的问题的问题。
在 C++ 中,我创建了一个帮助程序,能够检测给定模板方法的模板参数是否实现了 serialize
。方法(提升序列化实现)。
该助手可以完美地处理我可以使用的大多数类,但我想按如下方式扩展其功能。
假设我有一个 Foo
具有序列化方法的类。
我希望我可以将任何嵌套支持的容器传递给它 vector<list<array<Foo,8>>>
,鉴于 vector
, list
和 array
提供 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> {};
关于c++ - 在编译时迭代检查函数是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52153932/