gpt4 book ai didi

c++ - 为结构/类中的所有字段调用相同的方法

转载 作者:行者123 更新时间:2023-12-04 07:49:08 25 4
gpt4 key购买 nike

考虑以下代码。

struct Data {
int a = 100;
char* b = nullptr;
};

struct Data2 {
int c = 100;
char* d = nullptr;
};

template<typename T>
struct Test {
T field;
T field2;
};

int main()
{
Test<Data> test;
test.field.a = 500;
test.field2.a = 500;

Test<Data2> test2;
test2.field.c = 1000;
test2.field2.c = 1000;
}
我想要的是一种方法或运算符来做类似的事情
test.set<a> = {500, 500}
test2.set<c> = {1000, 1000}
基本上我想以某种方式指定字段名称,
遍历所有结构域
并从给定的值列表中设置值。
由于缺少反射机制,我怀疑这个问题无法用标准 C++(任何标准)解决。我的假设是否正确?

最佳答案

这样的事情怎么样? (利用数据成员指针)

struct Data
{
int a;
};

template<class T>
struct test
{
T field1, field2;
template <class U, U (T::* p)>
void set(U value)
{
field1.*p = value;
field2.*p = value;
}

};

int main()
{
test<Data> t;
t.set<int, &Data::a>(7);
}
我同意,写起来很麻烦,但似乎或多或少地实现了(尽管有点冗长和冗长)你想要什么。一个明显的缺点,我无法想出如何克服的缺点,就是您需要同时指定 intData::在您设置的模板参数中,而原则上两者都是编译器已知的。
更新:这是一个替代的、更清洁的解决方案 ñ:
struct Data
{
int a;
};

template<class T>
struct test
{
T field1, field2;
template <class U>
void set(U(T::* p), const U* values)
{
field1.*p = *values++;
field2.*p = *values++;
//...
}

};

int main()
{
test<Data> t;
int values[] = { 7, 8 };

t.set(&Data::a, values);
}

关于c++ - 为结构/类中的所有字段调用相同的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67073357/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com