你有一个简单的结构,比如说:
typedef struct rect
{
int x;
int y;
int width;
int height;
}
rect;
Run Code Online (Sandbox Code Playgroud)
并且您希望将每个元素乘以一个因子.除了将每个成员乘以值之外,是否有更简洁的方法来执行此操作?
Tyl*_*nry 10
并不是的.以编程方式获取结构元素的列表需要反射,C++不支持.
你的两个选择是给结构一个方法,这个方法以冗长的方式执行,然后在所有其他地方使用该方法,或者手动模仿反射,例如通过给结构另一个元素,它是一个指针数组所有其他元素(构建在struct的构造函数中),然后循环遍历它以执行缩放功能.
Jam*_*lis 10
没有; 没有办法迭代结构的成员.
但是,在这种特殊情况下,您可以通过使用数组来实现目标:
struct rect
{
// actually store the data in an array, not as distinct elements
int values_[4];
// use accessor/mutator functions to modify the values; it is often best to
// provide const-qualified overloads as well.
int& x() { return values_[0]; }
int& y() { return values_[1]; }
int& width() { return values_[2]; }
int& height() { return values_[3]; }
void multiply_all_by_two()
{
for (int i = 0; i < sizeof(values_) / sizeof(values_[0]); ++i)
values_[i] *= 2;
}
};
Run Code Online (Sandbox Code Playgroud)
(请注意,此示例没有多大意义(为什么要将x,y,高度和宽度乘以2?)但它演示了解决此类问题的不同方法)
Jos*_*ley 10
Boost.Fusion提供BOOST_FUSION_ADAPT_STRUCT宏,它可以将任何结构转换为Fusion序列,然后Fusion可以迭代(如快速入门中所示).
另一种选择是使用像Reflex这样的第三方C++反射库来迭代结构的成员.
但是,所有这些对您来说可能都是过度的; 手动列出每个类的成员可能不那么优雅,但它更简单,编码的简单性很重要.