有没有办法在C++中循环访问对象的不同数据成员
Is there a way to loop over different data members of an object in C++
如果我有一个由 3 个双精度组成的类对象:x、y 和 z,有没有办法在函数中循环它们?
例如
for(i in (x,y,z))
do something;
我可以用显式强制转换做类似的事情,但我想知道是否有更优雅的解决方案。
class testc {
public:
double x, y, z;
testc(double x, double y, double z)
:x(x), y(y), z(z)
{}
};
int main()
{
testc omega(1, 2, 3);
cout << *(double*)&omega << " " << *((double*)&omega +1) << " " << *((double*)&omega +2);
}
(C++20( 循环访问已知数量的公共成员:基于范围的 for 循环初始化语句中的结构化绑定
从 C++20 开始,我们可以将结构化绑定与基于范围的 for 循环初始化语句相结合(后者是 C++20 功能(:
语法
对于 (初始化语句(可选( 范围声明:范围表达式( ...
具体来说,在基于范围的 for 循环中使用结构化绑定作为init 语句:
#include <iostream>
class Foo {
public:
double x, y, z;
Foo(double x, double y, double z) : x(x), y(y), z(z) {}
};
int main() {
const Foo foo(1., 2., 3.);
for (auto [x, y, z] = foo; auto e : {x, y, z}) {
std::cout << e << " ";
} // 1 2 3
return 0;
}
但请注意,您只能使用结构化绑定来分解类的公共成员(在您的示例中,所有成员都是公共成员(。此外,对于基于 for 循环的范围表达式中的初始值设定项列表,您可能没有冲突的类型,这意味着此方法仅限于示例的上下文:其中所有公共成员都属于同一类型。
为什么使用结构化绑定而不是直接对类成员进行列表初始化?
现在,如果类的(公共(成员及其实例都有非常简短的名称,我们可能需要考虑省略结构化绑定,而是直接列表初始化类成员:
const Foo f(1., 2., 3.);
for (auto e : {f.x, f.y, f.z}) {
std::cout << e << " ";
} // 1 2 3
然而,尽管可以说更简短,但缺点是我们不再从编译器那里得到任何帮助来发现我们是否真的完全分解了所有公共成员(不少于,不多(,当我们使用结构化绑定时存在检查:
for (auto [x, y] = foo; auto e : {x, y}) { /* ... */ }
// error: type 'Foo' decomposes into 3 elements,
// but only 2 names were provided
for (auto [x, y, z, xx] = foo; auto e : {x, y, z, xx}) { /* ... */ }
// error: type 'Foo' decomposes into 3 elements,
// but 4 names were provided
for (auto&& i : std::vector<double>{x, y, z}){
// Do something, `i` is the double.
}
是一种方式,以创建向量为代价。我不相信编译器会将其检测为成语并进行优化。
像*(&x + 1)
这样的代码为了尝试达到y
的行为是不确定的。(指针算术仅在数组中有效。
你不能使用std::array
或std::vector
来x
、y
和z
吗?
相关文章:
- int数据类型的指针指向的是什么,如果是一个类的私有数据成员,我们创建了该类的两个对象?
- 使用指针访问数组中的对象数据成员
- 访问数据成员(本身是对象)的数据成员,就好像它们是类成员一样
- 有没有办法在C++中循环访问对象的不同数据成员
- "Class1"类"Class2"对象作为私有数据成员。如何通过"Class 2"函数引用"Class1"对象?
- 如何使用数据成员填充派生类的对象到基类的指针数组中
- 如何在C++中使用类对象访问指针数据成员
- 如何高效更改向量中所有对象的成员数据?
- C++中的常量对象或私有/常量数据成员(变量)?
- 指向未由对象地址初始化的对象的指针如何将值分配给类的数据成员
- 通过向量中的对象的数据成员迭代
- 继承的类对象如何使用私有数据成员
- 我如何在参考上使用数据成员而不使用新关键字创建对象
- 从R中访问C 对象数据成员
- 静态数据成员是否在所有类对象之前初始化?
- 通过指向对象数据成员的指针更改该对象的值
- C .更改对象数据成员的数据成员
- 排序类对象数据成员从大到小
- 如何设置对象数据成员与这个c++与这个
- 按对象数据成员属性搜索对象的向量