如何分配给结构对象的成员
How to assign to members of a struct object?
我正在迈出Boost.Hana的第一步,所以请耐心等待。我有
#include <boost/hana.hpp>
namespace hana = boost::hana;
using namespace hana::literals;
#include <string>
struct A
{
int integer;
std::string string;
};
int main()
{
auto tuple = hana::make_tuple(42, "42");
A a;
hana::for_each(hana::zip(hana::members(a), tuple), [](auto& element) { element[0_c] = element[1_c]; });
}
这是我尝试将每个元组元素分配给其各自的(顺序)A成员。这不起作用(有关完整错误,请参阅实时示例)。它归结为
main.cpp:19:54: note: candidate function [with $0 = boost::hana::tuple<int, int>] not viable: expects an l-value for 1st argument
hana::for_each(hana::zip(hana::members(a), input), [](auto& element) { element[0_c] = element[1_c]; });
^
我在文档中读到Hana算法具有按值语义,但是如何去做这种事情呢?从hana::tuple
构建A
是唯一可能的事情吗?
要就地修改Struct
,请使用 hana::accessors
,它提供了一个hana::pair
元组,每个元组都有一个键和一个访问器函数。另外,由于我们还没有反射,因此您需要使用BOOST_HANA_ADAPT_STRUCT
等宏之一来实现A
作为hana::Struct
。
另一个答案是 lambda 采用右值,因为压缩元组是一个临时对象。
#include <cassert>
#include <boost/hana.hpp>
namespace hana = boost::hana;
using namespace hana::literals;
#include <string>
struct A
{
int integer;
std::string string;
};
BOOST_HANA_ADAPT_STRUCT(A, integer, string);
int main()
{
auto tuple = hana::make_tuple(42, "42");
A a;
hana::for_each(
hana::zip(hana::accessors<A>(), tuple),
[&a](auto&& element) {
auto accessor_pair = hana::at_c<0>(element);
auto get_member = hana::second(accessor_pair);
get_member(a) = hana::at_c<1>(element);
});
assert(a.integer == 42 && a.string == "42");
}
我对 Boost 和 Hana 并不熟悉;但我去了他们的网站,阅读了他们关于他们的一些对象、函数等的一些文档。我不知道这是否会对您有所帮助,但我能够稍微修改您的代码,然后我得到了这个来编译:
int main() {
A a;
auto tuple = hana::make_basic_tuple( 42, "42" );
hana::for_each( hana::zip( hana::members(a), tuple),
[&](auto&& element) {
hana::at( tuple, hana::size_c<0> );
hana::at( tuple, hana::size_c<1> );
}
);
}
我将您的 lambda 更改为具有[&]
并将参数更改为auto&&
,我使用了 hana::at()
.AFAIK 我认为这目前没有分配任何东西,但您可以使用它并从这里开始,但积极的部分是,在您提供的演示代码和相同的编译器设置的同一网站上,这确实编译没有错误。现场演示
相关文章:
- 为什么我们再次从结构对象创建结构变量?
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- 结构对象的指针成员在传递给函数时被修改
- C++ 提升 - 包含类层次结构对象的类的序列化
- 如何将变量从变量传递到指针结构对象
- 在 boost::heap::p riority_queue 中推送结构对象时出错
- 在 c++ 中将结构的每个成员写入文件和将结构对象直接写入文件之间有什么区别吗?
- 为什么结构对象不是类型?
- 程序不会编译,使用带有结构对象的数组
- 在类构造函数中初始化自定义结构对象的正确方法
- 使用QString或字符串调用结构对象
- 在输入结构对象的输入过程中运行时间错误
- C 中的堆是否包含类和结构对象,或者仅包含指针
- 如何将部分初始化的结构对象放入向量
- 如何分配给结构对象的成员
- 尝试创建结构对象,在位置0x3FE00000中创建访问冲突写入错误
- erase() 不适用于结构/对象内的 STL 向量
- 将指向参数个数可变的函数的指针存储在结构对象中
- 如何通过先前存储的ID从结构对象中检索值?C
- 非结构对象布局