将数据集转换为任何stl容器

时间:2013-04-27 20:44:30

标签: c++ templates stl

我有一些已知类型的数据集,我想将其转换为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;
}

2 个答案:

答案 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()'方法