ふと思ったけれど,Expression Template で代入文の右辺だけじゃなくて,代入文も含めて ET にしてしまって,full expression の評価が完了した時点の一時オブジェクトのデストラクタ発動のタイミングで,ET にエンコードされた実際の式の評価を発動するっつー実装はありえるのかにゃ?
例えば,Boost.Assignment で
vector<int> v; v += 0, 1, 2, 3, 4;
つーのを実装する場合,+= で v に push_back する proxy オブジェクトを生成して,カンマ演算子で次々に push_back するっつーのが常識的なアイデアだろうけれど,そーじゃなくて加算代入演算子を含めた式全体を ET にエンコードして,最終的に ET によって生成された一時オブジェクトに対するデストラクタの発動を用いて,一時オブジェクトに溜め込んだ 0, 1, 2, 3, 4 への const 参照を渡る iterator でもって v.insert を発動するっちゅー実装はありえるんだろうーか.てか,Boost.Assignment の実際の実装ってどうなってるんだろーにゃー?どうなっているんだろうーにゃーじゃなくて,自分で実際にコード読めばよいんだろうけれどそれはめんどくさいにゃー.
でも ET で生成された各一時オブジェクトが,実際の評価を発動する権限を持つのかの(恐らく mutable bool な)動的フラグを持たないといけないから,あまりうまみがないというか,最適化が利きにくくなりそうだにゃー.
#Boost.Assignment の operator+= の実装は実際読んだら5秒で理解できる代物だった.単に逐次 push_back していっているだけ.しかし上記のアイデアもかなり難しい.昔 tuple の各要素を回る iterator なんてものを考えたことがあるけれど,それと同種の問題,異なる型のオブジェクトからなる collection を回る iterator が作れるかどうかっちゅー問題になるけれど,まぁそれは無理.なので,代入先のコンテナの値型に統一してしまって,その(const 参照ではなくて)オブジェクトのコピーを引きずり倒す(もの凄く最適化が効きにくそう)か,もしくは以前考えた const 参照エミュレーションを使うか.いずれにせよそんな単純な実装とはいかないふいんき<なぜか変換できない.