【发布时间】:2018-10-14 17:36:17
【问题描述】:
我有一个简单的特征struct hasMemberSerialize,我试图用它来确定任何给定的类是否与callSerialize() 兼容。 struct 看起来像这样:
template<typename Type, typename ArchiveType>
struct hasMemberSerialize {
template<typename T, typename A>
static auto test(int) -> decltype(Serialization::access::callSerialize(std::declval<A&>(), std::declval<T&>()), std::true_type);
template<typename, typename>
static std::false_type test(...);
static const bool value = std::is_same<decltype(test<Type, ArchiveType>(0)), std::true_type>::value;
};
这编译并运行良好,但是,我的hasMemberSerialize::value 总是 std::false_type。我使用了类似的方法来检查非模板方法;但是,我正在检查的 callSerialize() 方法看起来像:
template<typename Archive, typename Type>
static auto callSerialize(Archive& a, Type& t) -> decltype(t.serialize(a)) {
// Implementation
}
我使用std::cout 做了一些测试,如下所示:
Serialization::access::callSerialize(JSON, myType);
std::cout << std::boolalpha
<< hasMemberSerialize<MyType, JSONOutputArchive>::value << std::endl;
方法调用callSerialize(JSON, myType)按预期工作并序列化类型;但是,hasMemberSerialize::value 打印出false。最后,myType 是一个简单的测试类:
class MyType {
int myInt;
public:
MyType() : myInt(4) {}
template<typename Archive>
void serialize(Archive& a) {
a(myInt);
}
};
...
MyType myType;
【问题讨论】:
-
离题建议:你可以把
static constexpr bool,而不是简单的static const bool,变成value里面的hasMemberSerialize
标签: c++ c++11 templates sfinae decltype