2015-03-18 2 views
3

сказать, что я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 
    } 

Вышеприведенный код неправильный код, но я просто пытаюсь продемонстрировать, что я пытаюсь вычислить.

То, что я пытаюсь вычислить, - это цикл над вектором structs для определенного элемента. Возможно ли это простым способом? Может кто-то, пожалуйста, дайте мне несколько указателей, как получить доступ к члену структуры в общем виде (возможно, это то, что мне нужно, чтобы написать эту функцию).

Заранее спасибо.

+0

Это немного похоже на http://stackoverflow.com/a/3205057/667798. Я предлагаю выполнить «накапливание» над вектором, используя выражение лямбда, которое извлекает переменную-член, которую вы хотите. –

ответ

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

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

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

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)

0

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

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

Смотрите следующее для более подробной информации:

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