2

list<boost::any>不明なタイプが含まれているタイプのリストがあるとします。ここで、多形であるリスト内の要素に何らかの操作を適用したいとします。この場合、+演算子を検討してください。リストには常にoperator+をサポートする同種のオブジェクトのセットが含まれていることがわかっていて、リストの各要素の間にoperator +(ある意味では「合計」)を適用した結果を新しいブーストに取得したいとします。どれか。このようなもの:

boost::any sum(list<boost::any> lst) {
    // return lst[0]+lst[1]+lst[2] etc
}

operator +をサポートできる可能性のあるすべてのタイプを列挙せずに、これを行う方法はありますか?私はクレイジーなアイデアを非常に受け入れています。

(私は本当にこれを行う理由があります...私はインタプリタを実装しています)

4

3 に答える 3

3

boost::variantリストで可能なタイプの範囲がわかっている場合は、代わりに使用できます。

operator+含まれている型のすべての可能な組み合わせ、または通常のランタイムポリモーフィズムを処理する関数 のメッシュなしでこれを行う方法がわかりません。

boost::any最終出力で見たい具体的なタイプは何ですか?

ところで、インタプリタを実装している場合は、ここで設計の問題を明らかにする可能性のあるBoost.Spiritを確認してください。

于 2010-11-12T18:35:41.920 に答える
1

C ++は、コンパイル時に、名前ではなくタイプによって関数を照合します(演算子は、追加のインフィックス構文を持つ単なるファンシー関数です)。(実行時に、関連するオブジェクトが要求された操作をサポートしているかどうかを確認するのではなく。)
私が考えることができる唯一の例外は仮想関数です。タイプがポリモーフィックである場合は、マルチメソッドが欠落している場合の回避策のいずれかを使用できます(ダブルディスパッチ)。しかし、それらは何でもかまいませんので、私はあなたがこれを行うことができるとは思いません

タイプのセットが限られている場合は、テンプレートメタプログラミング加算を実装する関数の生成に役立つ場合があります。ただし、関係するタイプの数が限られている場合は、おそらくを使用しますboost::variant

(IMEによると、これは非常に短い時間で誰かがやって来て、私が間違っていることを証明することを意味します。)

于 2010-11-12T18:35:54.770 に答える
1

いいえ。boost::anyでもboost::Variantでもありません(「operator +をサポートできる可能性のあるすべてのタイプを列挙せずに」要件を修飾しません)。

あなたがする必要があるのはあなた自身のものを作ることです。boost::anyの背後にある概念は非常に単純です。ドキュメントを見ると、テクニックを説明する記事へのリンクがあります(基本的には、ポリモーフィズムを備えたハンドル/ボディのイディオムです)。あなたがする必要があるのは、あなたの様々なオブジェクトが持っていなければならないインターフェースを決定し、「any」インターフェースを書くことです、そしてそれはそれに応じて実装されます。そのようなものに似ているもの:

struct my_any
{
  template < typename T >
  my_any(T const& t) : pimpl(new impl<T>(t)) {}
  ...
  some_type get_some_type() const;
   ...
private:
  struct impl_base
  {
    ....
    virtual some_type get_some_type() const = 0;
  };
  template < typename T >
  struct impl : impl_base
  {
    some_type get_some_type() const { return t.get_some_type(); }
    impl(T const& t_var) : t(t_var) {}
    ....
  };
  boost::scoped_ptr<impl_base> pimpl;
};

some_type operator+ (my_any const& a, my_any const& b)
{
  return a.get_some_type() + b.get_some_type();
}

ジェネリック型でoperator+が何をするか想像するのは難しいので、私は少し意味のあるものを作りました。もちろん、ニーズに合わせて変更する必要があります。

于 2010-11-12T19:10:51.903 に答える