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 に答える