Я работал над некоторыми решениями для некоторых недавно опубликованных вопросов, в которых первоначальные спрашивающие пытались выяснить, существует ли метод в данном классе. Я пытался разработать решение, используя подход 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;
}
Результаты, если вы раскомментируете функцию catch-all test
, продолжат отображаться как false
. С закомментированной функцией я получаю ошибку компилятора, что нет версии test
, которая будет принимать аргумент int (&)[1]
. Мне любопытно, почему declval<R>().function()
не выглядит должным образом. Например, если я изменил это на что-то очень явное, например declval<T>().function()
, то это сработает. К сожалению, это не SFINAE, потому что, если в классе нет метода function()
, вместо тихого сбоя, я получаю ошибку компилятора.
Я уверен, что здесь есть что-то очень простое, чего мне не хватает. Спасибо за любую помощь, вы можете предоставить.