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
Смотрите следующие подробности:
- http://en.cppreference.com/w/cpp/language/operator_member_access
- http://en.cppreference.com/w/cpp/language/pointer
Кроме того, не имеет отношения к вашему вопросу, но вам нужно объявить тип вашей переменной цикла i
, В настоящее время оно не определено.