首页 > 解决方案 > 如何为对象中的数据动态赋值?

问题描述

我有一个结构,例如

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++dynamic

解决方案


不,你不能完全那样做。您想要的是在运行时通过成员的名称解析成员的地址。这称为反射,在 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
};

推荐阅读