有没有办法在c ++中将函数应用于结构的每个成员?

MM.*_*MM. 5 c++

你有一个简单的结构,比如说:

typedef struct rect
{
    int x;
    int y;
    int width;
    int height;
}
rect;
Run Code Online (Sandbox Code Playgroud)

并且您希望将每个元素乘以一个因子.除了将每个成员乘以值之外,是否有更简洁的方法来执行此操作?

Tyl*_*nry 10

并不是的.以编程方式获取结构元素的列表需要反射,C++不支持.

你的两个选择是给结构一个方法,这个方法以冗长的方式执行,然后在所有其他地方使用该方法,或者手动模仿反射,例如通过给结构另一个元素,它是一个指针数组所有其他元素(构建在struct的构造函数中),然后循环遍历它以执行缩放功能.

  • 这与其他人发布的强制转换解决方案完全相同,但语法更好.它同样依赖于特定编译器的行为,而标准C++并不能保证它能够正常工作. (2认同)

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++反射库来迭代结构的成员.

但是,所有这些对您来说可能都是过度的; 手动列出每个类的成员可能不那么优雅,但它更简单,编码的简单性很重要.


loc*_*cka 5

如果所有值都适合128位向量,那么您可以使用SIMD指令将它们全部相乘.例如英特尔集成性能基元(IPP)的原语对向量加法,减法,乘法等.

除非您正在进行大量的计算密集型操作,否则它可能会过度杀伤.