C++ цикл через вектор структуры

Скажи, что у меня есть

 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 ответа

Решение

Вам нужен указатель на член:

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 Сначала я не заметил, но вы должны передать вектор как ссылку, так как вы модифицируете элемент в нем.

Ну, это не является общим в том смысле, что у вас есть жестко закодированный вектор, но давайте на секунду проигнорируем это.

То, что вы хотите, это указатель на член:

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)

Концепция, которую вы ищете, называется указателем на член. Вы не можете использовать точный синтаксис, как вы написали, и указатель на синтаксис члена довольно некрасив и редко используется. Но вот основы.

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

Смотрите следующие подробности:

Кроме того, не имеет отношения к вашему вопросу, но вам нужно объявить тип вашей переменной цикла i, В настоящее время оно не определено.

Другие вопросы по тегам