1

我有一些已知类型的数据集,我想通过指定所需的类型将其转换为 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> >> >();

因此,我在我的 Dataset 类中创建了以下函数:

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;
}
4

2 回答 2

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).

于 2013-04-27T21:27:29.990 回答
0

也许这会做

template<typename T>
vector<T> convert();

如果您提到vector作为示例并且还想使用其他类型的容器,那么您应该为每个容器定义一个 `container_type convert_to_container_type()' 方法

于 2013-04-27T21:25:47.720 回答