我有一些已知类型的数据集,我想将其转换为stl 容器通过指定所需的类型,如下所示:
Dataset dataset0(....);
Dataset dataset1(....);
Dataset dataset2(....);
int i = dataset0.convert<int>();
vector<int> vi = dataset1.convert<vector<int> >();
pair<vector<bool>, pair<bool, float> > complex = dataset2.convert<vector<pair<vector<bool>, pair<bool, float> >> >();
因此,我在我的数据集类中创建了以下函数:
class Dataset
{
....
template<typename T>
T convert();
};
实现这样的基本类型是微不足道的:
template<>
int convert<int>()
{
return int(/*implementation*/);
}
但问题是,如何为任何类型的stl容器执行此操作。 像这样:
template<>
vector<T> convert<vector<T> >() // ?? does not compile. where would T come from?
{
vector<T> ret;
for(/* Loop determined from data */)
{
ret .push_back(convert<T>())
}
return ret;
}
答案 0 :(得分:2)
人们很想简单地说
template<typename T>
vector<T> convert<vector<T> >()
然而,这意味着您正在尝试定义函数模板的部分特化。这在C ++中是不允许的。
没有简单的解决方法。我能给出的唯一建议是以不同的方式命名convert
的不同变体(convert_to_vector
等)。如果您希望保持命名一致性,可以使用不同的转换器函数定义类模板Convertor
并将其专门用于不同类型。例如:
class Dataset
{
template<typename T>
T convert();
template<typename T>
vector<T> convert_to_vector() { return vector<T>(); }
template<typename T>
list<T> convert_to_list() { return list<T>(); }
};
template<>
int Dataset::convert<int>() { return 0; }
template<>
double Dataset::convert<double>() { return 0; }
template <typename T> class Convertor
{
public: T convert (Dataset& d) { return d.convert<int>(); }
};
template <typename T> class Convertor< vector<T> >
{
public: vector<T> convert (Dataset& d) { return d.convert_to_vector<T>(); }
};
template <typename T> class Convertor< list<T> >
{
public: list<T> convert (Dataset& d) { return d.convert_to_list<T>(); }
};
然后像Convertor<some-type>.convert(data)
一样使用它。
答案 1 :(得分:0)
也许这样做
template<typename T>
vector<T> convert();
如果您提到vector
作为示例并且也想使用其他类型的容器,那么您应该为每个容器定义`container_type convert_to_container_type()'方法