如何在嵌套向量中获取元素类型?

时间:2016-02-25 00:52:11

标签: c++ templates vector stl

我有一个DataType供用户定义,它可以是int, vector<int>, vector<vector<int> > ...我想知道是否有一些模板技巧来获取int类型?我更喜欢使用非c ++ 11方法,因为我的g ++版本是4.1.2而我无法更新它。

1 个答案:

答案 0 :(得分: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 typedef的所有内容。好处是它开箱即用std::vector<std::deque<std::list<int> > >;缺点是它可能太多(data_type<std::vector<std::string> >::typechar)。

如果您只是想让它与矢量一起使用,您可以这样做:

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