3

私はオブジェクトを持っています:

class Object {
public:
  boost::shared_ptr<QString> const& name() const {reutrn _name;}
private:
  boost::shared_ptr<QString> _name;
};

そして multi_index セット

typedef
    boost::multi_index_container<
        Object,
        boost::multi_index::indexed_by<
            boost::multi_index::ordered_unique<
                boost::multi_index::const_mem_fun<
                    Object,
                    boost::shared_ptr<QString> const&,
                    & Object::name>,
                StringPointerLess> > >
    ObjectSet;

セット内の何かを見つけたい場合は、QString そのコピーを作成してヒープに割り当てて作成する必要がありますshared_ptr

セットをそのままにして、この不要なコピー操作を回避することはできますか?

4

2 に答える 2

3

より簡単な方法: 次のメンバー関数をStringPointerLess比較述語に追加します。

struct StringPointerLess{
  ...
  bool operator()(boost::shared_ptr<QString> const& x,const QString& y)const{
    return *x<y;
  }
  bool operator()(const QString& x,boost::shared_ptr<QString> const& y)const{
    return x<*y;
  }
  ...
};

これで、目的の を提供するだけでルックアップできるようになりましたQString:

IteratorType find( MyContainerType const& container, QString const& key )
{
   return container.find( key );
}

この背後にある魔法については、Boost.MultiIndex ドキュメントの特別な検索操作のセクションで説明されています。

于 2013-03-06T07:00:44.547 に答える
1

はい、まだ shared_ptr を作成する必要がありますが、オブジェクトを削除しないカスタム デリーターを使用して、スタックからポインターとして渡すことができます。

もちろん、あなたの問題の 1 つは、あなたが でshared_pointerはないconstというconst QString &ことですconst_cast。私は後者を行いますが、どうするかはあなたにお任せします。

QString を渡すすべての場所でそれを行いたくないので、関数を書きましょう。

struct no_op_functor
{
 public:
   template< typename T > operator()( T* ) const
   {
   }
};

IteratorType find( MyContainerType const& container, QString const& key )
{
   boost::shared_ptr< QString > keyShared( const_cast<QString *>(&key), no_op_functor() );
   return container.find( keyShared );
}
于 2013-03-05T16:28:54.020 に答える