0

次の形式の generic_pair というクラスがあるとします。

template < typename K, typename V >
struct generic_pair{
  K key;
  V value;
};

さて、問題は、これらのgeneric_pairsの束をSTLコンテナーに格納できるようにしたいのですが、コンテナー内のすべての < K, V > が同じタイプになるわけではありません。たとえば、一部の要素は < int, int > である場合があり、他の要素は < int , string > などである場合があります。問題は、これをどのように行うことができるかです。

私の最初の考えは、「タグ」を使用してカプセル化された型の階層を作成し、コンテナーをジェネリック型で宣言しますが、実際の要素は継承された型で宣言することです。例えば、

struct base_type{
  typedef void type;
};

struct int_type: base_type{
  typedef int type;
}

struct string_type: base_type{
  typedef std::string type;
}

/// and so on establish a type hierarchy as necessary and then...

std::vector < generic_pair < base_type, base_type > > vec;

これを行うためのより良い、より正しい方法があると思いますか? 任意のアイデア、指示をいただければ幸いです。MPL または他の場所で同様の実装または関連するツール/手法を見たことがあれば、それも役に立ちます。(私はマクロを避けようとしています)

4

2 に答える 2

3

タイプのセットが事前に決定されている場合は、Boost.Variantを使用できます。そうでない場合は、Boost.Anyでうまくいくかもしれません。

于 2010-11-02T23:34:17.317 に答える
3

問題を明確にする質問とその後のコメントから、次のようにすると、あなたが求めていることを実行できます。

#include <iostream>
#include <vector>
#include <string>
#include <sstream>

// All class-template instantiations derive from this
struct AbstractPair
{
    virtual std::string serialize() const = 0;
};

template<typename K, typename V>
struct Pair : public AbstractPair
{
public:
    Pair(K key, V value) : key(key), value(value) {}

    std::string serialize() const
    {
        std::stringstream ss;
        ss << "Key: " << key << ", Value: " << value;
        return ss.str();
    }
    K key;
    V value;
};


int main()
{
    // Vector of pointers-to-abstract-base
    std::vector<AbstractPair *> v;

    // Create derived objects (instantiate class template)
    AbstractPair *p1 = new Pair<int,int>(5,10);
    AbstractPair *p2 = new Pair<float,std::string>(3.2f, "Hello");

    // Valid, and type-safe
    v.push_back(p1);
    v.push_back(p2);

    // Demonstrate polymorphism
    for(std::vector<AbstractPair *>::iterator it = v.begin(); it != v.end(); ++it)
    {
        std::cout << (*it)->serialize() << std::endl;
    }

    // Boilerplate cleanup
    delete p1;
    delete p2;
    return 0;
}

}

于 2010-11-02T23:54:51.467 に答える