У меня есть несколько шаблонов проверочных типа: is_object
от type_traits
и isSupportedContainer
реализована следующим образом:Рекурсивная проверка типа с использованием шаблонов
template <class T>
struct isSupportedContainer
: public false_type {};
template <class T>
struct isSupportedContainer < list<T> >
: public true_type {};
/*other containers*/
Я хочу сделать рекурсивную проверку isSupported
применения себя не только к тип контейнера, но также и к содержащемуся типу. Текущая реализация:
// using std::__and_ and std::for from type_traits
template <class T>
struct isSupported
: public __and_ < __or_ < is_object<T>, isSupportedContainer<T> >,
isSupported <T> > {};
Когда я называю isSupported < vector<int> >::value
, он генерирует кучу ошибок компиляции (укороченный):
In instantiation of 'struct std::__and_<...>, isSupportedContainer<std::vector<...> > >, isSupported<std::vector<...> > >':
required from 'struct isSupported<std::vector<int> >'
required from /*its call in main()*/
error: invalid use of incomplete type 'std::conditional<true, isSupported<std::vector<int> >, std::__or_<...>, isSupportedContainer<std::vector<...> > > >::type'
struct __and_<_B1, _B2>
^
In /*file containing isSupported and isSupportedContainer*/:
error: declaration of 'std::conditional<true, isSupported<std::vector<int> >, std::__or_<...> >::type'
struct isSupported
^
In function 'int main()':
error: 'value' is not a member of 'isSupported<std::vector<int> >'
cout << isSupported < vector<int> >::value;
^
Итак, как такая проверка будет осуществляться?
Примеры: предполагающие list
и vector
в качестве поддерживаемых классов vector<list<int>>
также поддерживается и vector<list<vector<string>>>
не
UPD: рабочая версия
UPD2: нет, не работает
template <class T>
struct isSupported
: public isSupportedSimpleObject<T> {}; //is_object turned out to be a wrong thing
template <template<class> class T, class U>
struct isSupported < T<U> >
: public __and_ < isSupportedContainer<T<U>>,
isSupported <U> > {};
Вы, кажется, используете 'isSupported' в определении 'isSupported'. Кроме того, 'std :: is_object', вероятно, не будет делать то, что вы ожидаете от него. –
О, да, это ошибка. О 'is_object': почему? Я ожидаю, что это позволит непустым фундаментальным типам, массивам и указателям. Перечисления и союзы также приемлемы. – Alex
'is_object' позволяет * все * через, включая неподдерживаемые контейнеры. Он только отфильтровывает функции, ссылки и 'void'.Если вы хотите поддерживать все типы неконтейнеров и некоторые контейнеры, вам будет трудно различать контейнеры из неконтейнеров. На уровне языка нет различия. –