gpt4 book ai didi

c++ - 使用 SFINAE 检测模板方法

转载 作者:行者123 更新时间:2023-11-30 04:55:59 25 4
gpt4 key购买 nike

我有一个简单的特性 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::valuealways 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 auto test(int) -> decltype(Serialization::access::callSerialize(std::declval<A&>(), std::declval<T&>()), std::true_type);

需要

static auto test(int) -> decltype(Serialization::access::callSerialize(std::declval<A&>(), std::declval<T&>()), std::true_type{});

注意:std::true_type 后的花括号.

正如 Max66 在他的评论中解释的那样:

the point is that decltype() return the type of an object; so decltype(3) is int; when you write decltype(std::true_type) (that is as decltype(int)) you ask the type of a type; you have to ask the type of an object of type std::true_type, that is decltype(std::true_type{}) or (better, IMHO) decltype(std::declval<std::true_type>())

关于c++ - 使用 SFINAE 检测模板方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52805308/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com