3

だから私は文字列型のフライ級を持っています:

typedef boost::flyweight< std::string, boost::flyweights::intermodule_holder > SymbolName_t;

そして、私はこれのインスタンスをそれらのベクトルにプッシュしたいのですが、素朴なアプローチは機能しません:

void PushSome( std::vector < SymbolName_t >& list)
{
  std::string& str = getSomeStr();
  list.push_back( str ); // <--- won't compile
}

だから私は一時的なコンストラクターを追加しました:

void PushSome( std::vector < SymbolName_t >& list)
{
  std::string& str = getSomeStr();
  list.push_back( SymbolName_t(str) ); // <--- compiles ok
}

私の質問は、言語の制約を考えると、このアプローチは最適ですか?静的変換演算子を提供するなど、他の方法でこれを実装すると、どのようなメリットがありますか?boost::flyweightテンプレートを変更する必要があるため、非明示的なコンストラクターを介した暗黙的な変換は有効なオプションとは見なされません。

4

2 に答える 2

3

C ++ 11コンパイラを使用している場合は、emplace_backの代わりに使用できますpush_back。これにより、コピーが不要になります。

于 2012-03-26T03:39:45.307 に答える
1

私がC++について知っていることから、リストへの参照を渡し(割り当てまたはコピーコンストラクターが呼び出されない)、文字列への参照を取得する(ここでも、割り当てまたはコピーコンストラクターがない)ため、上記のコードが最良のオプションである可能性があります。次に、新しく作成SymbolName_tしたものをリストにプッシュします。残念ながら、STLコンテナは引数のコピーを操作するため、コピーコンストラクタまたは代入演算子(どちらがstd::listここで使用)は、その時点で呼び出されます。他のオプションには、変換演算子を含めることが含まれる場合がありますが、リストは初期オブジェクトを作成してから、それをSTLコンテナーにコピーする必要があります。別のSTLコンテナを使用しても、これは当てはまります。ですから、変換演算子は実際には何も購入しません、私見。

上記のコード(「コンパイルOK」ブロック)が最善の策かもしれません。STLコンテナの制約の中で、これ以上効率的な方法は考えられません。shared_ptrtoを使用してパフォーマンスを購入することもできますがSymbolName_tboost:flyweightメモリの管理に関してはすでに最適化されているはずですが、繰り返し文字列が多い場合、それがどれだけ購入するかはわかりません。

于 2012-03-26T02:45:41.300 に答える