Я пытаюсь обернуть голову вокруг SFINAE. Мы используем его, чтобы проверить, есть ли у класса метод «Пассажиры».Проверка SFINAE C++
С некоторыми онлайн-примерами мы построили следующие классы шаблонов.
#ifndef TYPECHECK
#define TYPECHECK
#include "../Engine/carriage.h"
namespace TSS{
template<typename T>
class has_passengers{
private:
typedef char one;
typedef struct{char a[2];} two;
template<typename C> static one test(decltype(&C::Passengers));
template<typename C> static two test(...);
public:
static bool const value = sizeof(test<T>(0)) == sizeof(one);
};
template<typename T>
struct CarriageTypeCheck{
static_assert(has_passengers<T>::value, "Train initialized with illegal carriage");
};
}
#endif // TYPECHECK
я часть, как выбирается либо из двух тест-методов, но то, что я не понимаю, почему test<T>
инициализируется 0 в следующей строке:
static bool const value = sizeof(test<T>(0)) == sizeof(one);
я могу не видите, как 0 важно для проверки работы. Другое дело - почему используется decltype?
Вы не проверяете, имеет ли класс функцию-член 'Пассажиры'. Вы проверяете, есть ли у него член «Пассажиры», который может быть функцией, но не обязательно. – krzaq
Хорошая точка! Благодаря! –