c++ - 如何为对象中的数据动态赋值?
问题描述
我有一个结构,例如
struct Test
{
std::string a;
std::string b;
std::string c;
};
在项目的另一部分,我想为结构中的一个或三个值分配值(我想编辑它)。
可以这样做:
void foo (std::string newValue, std::string nameOfStructMember)
{
for(auto & it : test) //in another part of project exist std::vector<Test> test;
{
it.nameOfStructMember= newValue;
}
}
例如在main.cpp
:
foo("This is my new value", "a");
解决方案
不,你不能完全那样做。您想要的是在运行时通过成员的名称解析成员的地址。这称为反射,在 C++ 中是不可能的。
但是,您可以使用成员指针做一些非常相似的事情。
void foo(const std::string &newValue, std::string Test::*member)
{
for(auto & it : test)
{
it.*member = newValue;
}
}
member
本质上持有 的某个成员的偏移量Test
,这样就it.*member
可以访问该成员。你可以调用这个函数
foo("This is my new value", &Test::a); //or &Test::b and so on
这里的主要缺点显然是,&Foo::a
需要在编译时知道。但是您可以轻松地使用 astd::unordered_map
将实际成员名称映射到成员指针:
std::unordered_map<std::string, std::string Test::*> mapping {
{"a", &Test::a},
// and so on
};
推荐阅读
- pandas - 根据 Pandas 数据框中函数的条件更新列中的字符串
- excel - 如何将此代码格式公式转换为 VBA 代码
- reactjs - 如何将链接从帖子列表重定向到有效帖子?
- ajax - 如何检索从 AJAX 调用接收到的数据。未定义
- python - 如何绘制以 id 作为节点标签的树
- python - 用间隔之间的每日值填充索引
- python - “AttributeError: 'module' object has no attribute 'send'” 使用套接字作为后门时
- javascript - 在 React 中动态设置文本区域的 PlaceHolder 颜色
- c# - 急切加载得到不完整的结果
- r - 寻找基于多变量组内的值差异过滤 data.table 的更清洁方法