2009-09-02 10 views
0

私は、パラメータとしてキーを持つメンバー関数を使用するboost :: multi_indexコンテナを作成しようとしています。boost :: multi_index index by function call byパラメータ

class Data { 
public: 
    std::string get(const std::string & _attr) { return _internals_fetch_data(_attr); } 

/* 
    assume some implementation for storing data in some structure(s) 
*/ 
}; 

は私が上で複数なインデックスにしたい、これらのデータ項目の長方形リストがあるとします。 長方形は、リスト内のすべてのアイテムがGET経由で同じ属性を持っていることを意味()

ブースト:: multi_index宣言は、そのBOOST_MULTI_INDEX_CONST_MEM_FUNCT()除き

typedef multi_index_container< 
    Data, 
    indexed_by< 
    ordered_unique< 
    BOOST_MULTI_INDEX_CONST_MEM_FUN(Data,String,get) 
    > 
    > 
> my_container; 

のようなものは、これらの機能を持っていないです。 コンポジットキーは引き続きメンバ変数で動作します。

どうすればこの問題を回避できますか? 私>は、ブーストをordered_unique <を与えることができますようにそれは見ていません::はfunction1

EDIT:

いくつかの考えた後、ここで私が何をしようとしているの要旨はあります。

boost :: multi_indexは、コンパイル時にインデックス機能を決定します。これらの機能を回避し、実行時に決定されたインデックスを使用するにはどうすればよいですか?

答えて

2

あなたは関数の引数として何を渡すと思いますか? const std::string & _attrとは何ですか?

とにかくBOOST_MULTI_INDEX_CONST_MEM_FUNは、const_mem_funファンクタのマクロです。あなた自身のファンクタconst_mem_fun1を書くことができます。しかし、私はあなたがそれをどのように使うのか分かりません。 const_mem_funの実装は参照(またはラッパー、例えばshared_ptr)によってオブジェクトを受け取り、引き数なしでメンバ関数を呼び出します。

boost::multi_index::indexed_byはタイプであり、オブジェクトではなく、ordered_uniqueが予期するタイプです。だから、const_mem_fun1<Data, std::string, &Data::get>("string")と書くことはできません。なぜgetファンクションをパラメータなしで使用できず、Data構造体に特別な文字列フィールドを作成できないのですか?

struct Data { 
    std::string _attr; 
public: 
    std::string get() const { return _internals_fetch_data(_attr); } 
}; 
+0

これは問題です。 _const_mem_fun1_をここで使用できるようには見えません。 –

+0

引数を渡す方法は? 'ordered_unique ("文字列 ")>'のようなもの? –

+0

多分( "string")は別のパラメータとしてstruct/wrapperになることがあります。 –