模板类来管理容器,获取包含数据的类型

时间:2016-02-18 03:32:23

标签: c++ templates

我有一个模板化的c ++类,它对容器起作用。在类实现中,我需要访问容器包含的数据类型。我目前的定义如下:

template <typename ContainerType, typename DataType>
class MyClass {
    DataType a;
    DataType foo(DataVector& vec, DataType s);
};

当我实例化它时,我就像这样实例化

MyClass< vector<float>, float > c1;
MyClass< CustomVector<double>, double > c2;
MyClass< Lib::ContainerFloat, Lib::Float > c3; 

这样可行,但有没有办法在不重复类型信息(即浮点数,双重等)的情况下执行此操作?即使用一些类似decltype的魔法来获取包含的数据类型。所以我希望能够实例化:

MyClass< vector<float> > c1;
MyClass< CustomVector<double> > c2;
MyClass< Lib::ContainerFloat > c3; 

并使用:

声明该类
template <typename ContainerType>
class MyClass {
    // get DataType automatically from ContainerType
    DataType a;
    DataType foo(DataVector& vec, DataType s);
};

2 个答案:

答案 0 :(得分:4)

作为一个概念,所有容器都应该支持value_type作为一种类型。请参阅http://en.cppreference.com/w/cpp/concept/Container

我上次检查,value_type受以下支持:

  1. std::vector
  2. std::list
  3. std::set
  4. std::multiset
  5. std::unordered_set
  6. std::queue
  7. std::array
  8. std::map
  9. std::unordered_map
  10. std::multimap
  11. std::stack
  12. std::priority_queue
  13. 我认为使用它是安全的:

    template <typename ContainerType>
    class MyClass {
       using DataType = ContainerType::value_type;
    };
    
    MyClass< vector<float>> c1;
    

    如果DataType可能与ContainerType::value_type不同,那么最好使用(感谢@AlexeyAndronov提供建议):

    template <typename ContainerType,
              typename DataType = ContainerType::value_type>
    class MyClass {
    };
    

答案 1 :(得分:2)

假设您正在使用标准库容器模板,每个此类模板都定义其值类型的定义。在您自己的自定义容器中执行此操作也是一种很好的做法。

鉴于此定义可用,此模式应涵盖您描述的用例。

template<class container>
class MyClass{
public:
    typename container::value_type a;
};