我试图用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
答案 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