Boost.Hana中的Boost.Fusion是否有相当于View的概念?

时间:2016-05-18 13:50:10

标签: c++ boost metaprogramming c++14 boost-hana

我试图用hana::for_each迭代用户定义的结构,并注意到它被复制/移动,而Boost.Fusion允许你就地迭代原始结构。

我在View的{​​{1}}中找不到类似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 } hana::transform应用于成员,但std::ref不是Struct,因此Functior不适用于这个案例。我能够使用transform实现所需的行为,但它对我来说看起来有些笨拙。我希望有办法创造观点。

hana::accessors

2 个答案:

答案 0 :(得分:4)

Jason说Hana的观点有实验性的支持是正确的。你遇到的问题很常见,而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 s序列,您可以随身携带,但在访问它们时您必须使用.get()。在Hana的未来版本中,hana::members可能会返回键/值对的视图,其中值是对原始成员的引用。但在可能的情况下,有几个问题必须解决。

希望这有帮助!

答案 1 :(得分:3)

就观点而言,boost/hana/experimental/view.hpp中有一些未记录的特征,因此它们似乎在Boost.Hana中即将出现。

Struct的当前问题是键值对上的Foldable。在hana::unpack中,它会将结构中的每个值都放在一对中,从而创建一个副本。使用hana::accessors的解决方案目前是进入IMO的方式。

请注意,目前存在一个未解决的问题:https://github.com/boostorg/hana/issues/175