hana::for_each
というユーザー定義の構造体を繰り返し処理しようとしていましたが、コピー/移動されたことに気付きましたが、Boost.Fusion
は元の構造体のインプレイスを反復処理できます。Boost.FusionのBoost.HanaのViewコンセプトに相当するものがありますか?
のコンセプトのようなものがBoost.Fusion
からBoost.Hana
に見つかりませんでした。毎回コピー/移動せずにシーケンスに変換を適用するにはどうすればよいですか?
#include <boost/hana.hpp>
#include <iostream>
struct Foo {
Foo() = default;
Foo(const Foo&) { std::cout << "copy" << std::endl; }
Foo(Foo&&) { std::cout << "move" << std::endl; }
};
struct Struct {
BOOST_HANA_DEFINE_STRUCT(Struct,
(Foo, foo)
);
};
int main() {
Struct s;
auto m = boost::hana::members(s); // copy constructor invoked
}
UPDATE:私はメンバーにstd::ref
を適用するためにhana::transform
を使用しようとしましたが、Struct
がFunctior
ないので、transform
、この場合には適用されません。私はhana::accessors
を使って目的の動作を達成することができましたが、それは私にはちょっとハッキリしています。ビューを作成する方法があることを願っています。
hana::for_each(hana::accessors<Struct>(), [&s](const auto& accessor) {
const auto& member = hana::second(accessor)(s); // No copying
});
Louis Dionneの[この回答](http://stackoverflow.com/a/34711884/2417774)の編集は便利です(コメントの議論にも役立ちます)。 – llonesmiz
彼はおそらく明示的なビューのサポートを避けています。その理由は、C++ 2xではすべてがレンジベースのSTL v2とgsl :: spanで何が変わるからですかなど –