2016-02-25 2 views
1

У меня есть DataType для определения пользователем, это может быть int, vector<int>, vector<vector<int> > ... Я хочу знать, есть ли какие-либо шаблонные трюки, чтобы получить тип int? Я предпочитаю использовать метод C++ 11, потому что моя версия g ++ 4.1.2, и я не могу ее обновить.Как получить тип элемента в векторе вложенности?

ответ

5

Это работает на GCC 4.3, который является самой ранней версией GCC. У меня есть легкий доступ. Вам нужно будет проверить, работает ли это с 4.1.2.

template<class T> struct voider { typedef void type; }; 

template<class T, class = void> 
struct data_type { 
    typedef T type; 
}; 

template<class T> 
struct data_type<T, typename voider<typename T::value_type>::type> 
     : data_type<typename T::value_type> {}; 

Вы можете использовать его как, например,

typename data_type<DataType>::type meow; 
// type of 'meow' is int if DataType is vector<vector<int> >, or vector<int>, or int 

Это использует the void_t trick и работает со всем, что определяет value_type ЬурейеЕ. Выгода заключается в том, что он работает из коробки для std::vector<std::deque<std::list<int> > >; недостатком является то, что это может быть слишком много (data_type<std::vector<std::string> >::type - char).

Если вы просто хотите работать с векторами, вы можете сделать:

template<class T> 
struct data_type { 
    typedef T type; 
}; 

template<class T, class A> 
struct data_type<std::vector<T, A> > 
    : data_type<T> { }; 

// partially specialize for other containers if wanted 
+0

Это немного сложно для меня. Не могли бы вы дать мне пример о том, как использовать для 'vector >', и как он делает трюки? – maple

Смежные вопросы