2016-05-18 25 views
4

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を使用しようとしましたが、StructFunctiorないので、transform、この場合には適用されません。私はhana::accessorsを使って目的の動作を達成することができましたが、それは私にはちょっとハッキリしています。ビューを作成する方法があることを願っています。

hana::for_each(hana::accessors<Struct>(), [&s](const auto& accessor) { 
    const auto& member = hana::second(accessor)(s); // No copying 
}); 
+3

Louis Dionneの[この回答](http://stackoverflow.com/a/34711884/2417774)の編集は便利です(コメントの議論にも役立ちます)。 – llonesmiz

+0

彼はおそらく明示的なビューのサポートを避けています。その理由は、C++ 2xではすべてがレンジベースのSTL v2とgsl :: spanで何が変わるからですかなど –

答えて

3

ジェイソンはハナのビューの実験的サポートがあることは言うに正しいです。あなたが遭遇する問題は一般的なものであり、Hanaは現在それを優雅な方法で扱っていません。私は、Hanaにビューを追加することで、意味のあるすべてのアルゴリズムにバイ・バリュー・セマンティクスとリファレンス・セマンティクスの両方を提供することで、この問題を解決できることを願っています。しかし、これを一貫性のあるやり方で加えることは、自明ではないので、フィーチャの実験的な状態です。言われて、あなたはどちらか使用してアクセサ(あなたがあなたの質問に表示される)によって、または代わりに、構造体のメンバに関連したキーに反復することによって、あなたの問題を解決できることを

#include <boost/hana.hpp> 
#include <iostream> 
namespace hana = boost::hana; 

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; 
    hana::for_each(hana::keys(s), [&s](const auto& key) { 
     const auto& member = hana::at_key(s, key); // No copying 
    }); 
} 

あなたの場合次のようにあなたが参照のシーケンスを作成することができ、シーケンスとしてメンバー自身を操作したいのですが、それらをコピーしたくない:

#include <boost/hana.hpp> 
#include <iostream> 
namespace hana = boost::hana; 

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 members = hana::transform(hana::keys(s), [&s](auto const& key) { 
     return std::ref(hana::at_key(s, key)); 
    }); 
} 

membersは、あなたの周りに運ぶことができるstd::reference_wrapper秒のシーケンスになります、しかし、それらにアクセスするには.get()を使用する必要があります。 Hanaの将来のバージョンでは、hana::membersはおそらくキーと値のペアのビューを返します。値は元のメンバーへの参照です。しかし、これが可能になるまでに解決しなければならない問題がいくつかあります。

希望すると便利です。

3

限りビューが懸念しているとして、いくつかの文書化されていない機能は、そう、彼らは確かにBoost.Hanaための地平線上にあるように見えるboost/hana/experimental/view.hppです。

Structの現在の問題は、キー値のペアでFoldableであることです。 hana::unpackでは、構造体からの各値をペアにしてコピーを作成します。 hana::accessorsを使用するあなたの解決策は、現在IMOに行く方法です。

現在、このための未解決の問題があることを

注:https://github.com/boostorg/hana/issues/175

関連する問題