gpt4 book ai didi

c++ - SFINAE检测静态方法

转载 作者:太空狗 更新时间:2023-10-29 21:12:41 25 4
gpt4 key购买 nike

我正在尝试实现一种机制来检测提供的类是否包含某些静态方法。这是非常简单的代码,但我不明白为什么 decltype() 不能像预期的那样为 EnableIfHasFooMethod 类的特化工作:

#include <iostream>

struct A {
static int Foo() { return 0; }
};

template <class T, class = void>
struct EnableIfHasFooMethod {};

template <class T>
struct EnableIfHasFooMethod<T, decltype(T::Foo)> {
typedef void type;
};

template <class T, class = void>
struct HasFooMethod {
static const bool value = false;
};

template <class T>
struct HasFooMethod<T, typename EnableIfHasFooMethod<T>::type> {
static const bool value = true;
};

int main() {
std::cout << HasFooMethod<A>::value << std::endl;
return 0;
}

输出是0,但应该是1

最佳答案

你忘记添加 void()

template <class T>
struct EnableIfHasFooMethod<T, decltype(T::Foo, void())> { /* ... */ };
// ...........................................^^^^^^^^

需要匹配

中的第二种( void)
// ........................vvvv
template <class T, class = void>
struct EnableIfHasFooMethod {};

所以你的 decltype() 必须返回 void 当且仅当当且仅当 中有一个 Foo() 成员T.

你不会写

decltype( T::Foo )

因为在这种情况下,decltype() 返回不能为 void 的成员 Foo(如果存在)的类型.

你不会写

decltype( void() )

因为,在这种情况下,decltype() 返回ever void,但如果有 Foo T

中的成员

所以解决方案是

decltype( T::Foo , void() )

因此 SFINAE 可以工作,如果没有 Foo 成员则替换失败,如果有 Foo 则返回 void

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

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