C ++循环通过结构向量

时间:2015-03-18 15:28:46

标签: c++ pointer-to-member

说我有

 struct S {
    double A;
    double B;
    double C;
  };

   std::vector<S> vecS(10);

我正在尝试编写泛型函数void F(std::vector<S> vecS,structure S.x),以便可以进行以下计算

 F(std::vector<S> vecS, structure S.x) {
        for(i=1;i<10;i++)
          vecS[0].x += vecS[i].x;  
       // note the structure does not have memeber "x"
       // I want to give that as a generic input to access A,B or C
  }

上面的代码不是正确的代码,但我只是想说明我想要计算的内容。

我想要计算的是循环特定元素的结构向量。这可能是一个简单的好方法吗?有人可以给我一些指示如何以通用方式访问结构的成员(也许这就是我需要编写这个函数)。

提前致谢。

3 个答案:

答案 0 :(得分:5)

您需要的是指向成员的指针:

void F( std::vector<S> &vecS, double S::*ptr )
{
    for(i=1;i<10;i++)
       vecS[0].*ptr += vecS[i].*ptr;  
}

// now call for A
F( vec, &S::A );

如果您需要使用不同的类型,而不仅仅是double,请使用模板。

PS我没有先注意到,但你必须传递矢量作为参考,因为你修改了元素。

答案 1 :(得分:1)

嗯,在你有一个硬编码的矢量的意义上它不是通用的,但让我们忽略它一秒钟。

你想要的是指向成员的指针:

template <typename T, typename M>
F(std::vector<S> vecS, M T::* member) {
        for(i=1;i<10;i++)
          vecS[0].*member += vecS[i].*member;  
}

请致电F(vec, &myClass::A)

答案 2 :(得分:0)

您正在寻找的概念称为指向成员的指针。您不能使用您编写的确切语法,并且指向成员语法的指针相当丑陋并且不常用。但这是基础知识。

double S::*x = &S::A;
vecS[0]->*x += vecS[i]->*x

有关详细信息,请参阅以下内容:

此外,与您的问题无关,但您需要声明循环变量i的类型。目前,它尚未定义。