我有一个模板化的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);
};
答案 0 :(得分:4)
作为一个概念,所有容器都应该支持value_type
作为一种类型。请参阅http://en.cppreference.com/w/cpp/concept/Container。
我上次检查,value_type
受以下支持:
std::vector
std::list
std::set
std::multiset
std::unordered_set
std::queue
std::array
std::map
std::unordered_map
std::multimap
std::stack
std::priority_queue
我认为使用它是安全的:
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;
};