对于最近发布的一些问题,我一直在研究一些解决方案,其中原始提问者一直试图查询给定类中是否存在方法。我一直在尝试使用 SFINAE 方法开发解决方案,但不幸的是我一直空着。
这是我尝试的一种解决方案,该解决方案不适用于允许我们检测另一个类是否具有名为的方法的类function()
:
#include <iostream>
using namespace std;
struct sample_class
{
void function() {}
};
template<typename T>
class test_size_call
{
private:
typedef char yes;
typedef char (&no)[2];
int tester[1];
template <unsigned int>
struct helper { static const unsigned int value = 1; };
template<typename R>
static yes test(int (&a)[helper<sizeof(std::declval<R>().function(), 0)>::value]);
/* template<typename R>
static no test(...); */
public:
static const bool value = (sizeof(test<T>(tester)) == sizeof(yes));
};
int main()
{
cout << "Has function() method: " << test_size_call<sample_class>::value << endl;
return 0;
}
结果,如果您取消注释全部test
功能,则继续显示为false
. 注释掉该函数后,我得到一个编译器错误,即没有版本test
可以接受int (&)[1]
参数。我很好奇为什么declval<R>().function()
似乎没有正确实例化。例如,如果我将其更改为非常明确的内容,declval<T>().function()
那么它就可以工作。不幸的是,这不是 SFINAE,因为如果该类没有function()
方法,而不是静默失败,我会收到编译器错误。
我敢肯定,我在这里缺少一些非常简单的东西。感谢您的任何帮助,您可以提供。