3

整数からタプルのセットへのマップを作成する必要があります。単一のセット内のタプルは同じサイズです。問題は、タプルのサイズとそのパラメーターの型が、コンパイル時ではなく実行時に決定できることです。私は次のようなものを想像しています:

std::map<int, std::set<boost::tuple> >

しかし、ポインタを使用して、これを正確に行う方法がよくわかりません。

これの目的は、それぞれが一意の識別子 (キー) を持つ一時的な関係 (テーブル) を作成することです。別の方法があるかもしれません。

4

4 に答える 4

4

の目的boost::tupleは、任意の型を混在させることです。もし、おっしゃる通り、

整数のみを挿入しています

を使用する必要がありますmap< int, set< vector< int > > >。(私があなただったら、それにいくつかtypedefの s を投げます。)

ただし、元の質問に答えるには、boost::tuple実行時に任意の型を許可しません。boost::anyします。ただし、any比較はサポートしていないため、set.

typedef vector< boost::any > tuple;
struct compare_tuple { bool operator()( tuple const &l, tuple const &r ) const {
    assert ( l.size() == r.size() );

    for ( tuple::iterator lit = l.begin(), rit = r.begin();
          lit != l.end(); ++ lit, ++ rit ) {
        assert ( lit->type() == rit->type() );

        if ( lit->type() == typeid( foo ) ) { // find the type and perform "<"
            return boost::any_cast<foo>(*lit) < boost::any_cast<foo>(*rit);
        } else if ( lit->type() == typeid( bar ) ) {
            return boost::any_cast<bar>(*lit) < boost::any_cast<bar>(*rit);
        } /* etc; you will need to enumerate all the types you can insert */
    }
} };

typedef std::map< int, std::set< tuple, compare_tuple > > main_map;
于 2010-03-23T04:13:35.263 に答える
2

最新の補足として(以前の回答は2010年頃であるため)、今日のVariadic Templatesはこれに役立ちます:

template<typename... Args> //Accept any number of arguments and types
auto MyFunction(std::tuple<Args...> &T)->void
{
   //Do stuff...
}
于 2016-09-11T10:37:43.993 に答える
0

これらの異なるセットに共通の基本クラスがある場合にのみ、これらの異なるセットを同じコレクションに格納できます。抽象インターフェースを作成し、それをテーブル/タプルの種類ごとに実装できます。問題は、通常、このようなインターフェースは非常に乱雑になる傾向があり、多くのタイプのテーブル/タプルがある場合、クラス爆発が発生する可能性があることです。Boost.Anyは、そのようなインターフェイスに役立ちます (さまざまなデータ型を動的に処理する必要があるため)。

于 2010-03-10T12:14:39.567 に答える
0

パラメーターの型に共通点がある場合は、それを抽象基本クラスに取り込み、タプルにこの基本クラスへのポインターを含めます。

class MyParamBase {
public:
    virtual int getFoo() = 0;
    virtual void setFoo(int) = 0;
};

std::map<int, std::set<MyParamBase*> > container;

(boost::tuple は簡潔にするために省略されています。タプルのセットが必要な理由がわかりません。)

その後、MyParamBase から具体的なパラメーターの型を派生させ、それらを作成してマップに挿入できます。

class SomeParam: MyParamBase {
public:
    virtual int getFoo() { ... }
    virtual void setFoo(int a) { ... }
};

std::set<MyParamBase*> some_set;
some_set.insert(new SomeParam());
container[123] = some_set;

パラメータ タイプに共通点がない場合は、それらを同じマップに配置しないでください。それらは一緒に属していない可能性が非常に高いです。

于 2010-03-10T12:16:58.417 に答える