Czy można stworzyć uniwersalną metodę klasy A, która będzie używać różnych metod klasy B w zależności od potrzeby?

0

Cześć,
w dużym uproszczeniu tak mniej więcej wygląda kod, który przedstawia mój problem, pomijam z wiadomych celów wszystkie konstruktory itp:

class B{
    int a;
    int b;
    int d;
public:
    int geta(return a;); 
    int getb(return b;);
    int getd(return d;);
}


class A{
    int sumOfA;
    int sumOfB;
    int sumOfD;
    std::vector<<B>> Objects;
public:
   void sumAll(int uniwersalSum) // przez argument przesylam pole które będzie sumowane
   {
   for (...){
       uniwersalSum += Objects[i].get? ...*** // No i właśnie tutaj jest ten problem
   }
   }
   void CalculateAll()
  {
     sumAll(sumOfA);
     sumAll(sumOfB);
     sumAll(sumOfD);
}    

No i właśnie chciałbym uniknąć tworzenia 3 metod, które będą sumować wszystkie "a", "b", "d". Chciałbym mieć jedną uniwersalną metodę, która w razie konkretnego wywołania będzie potrafiła wyciągnąć z obiektów klasy B odpowiednie pole, np "int b" i w tym wypadku zsumować. Coś jakby taki szablon. Czy da się to wszystko jakoś sprytnie zaprogramować, czy muszę po prostu skopiować całą metodę ile razy tam chce i w jednej linijce podmienić po prostu z geta na getb/getd?
W moim praktycznym przypadku plik będzie miał po prostu dużo linii kodu. Niby mógłbym, ale chciałbym tego uniknąć.

Z góry dzięki za pomoc

0

Nie bezpośrednio. Możesz dodać nową funkcję, get, którą przeładujesz/wyspecjalizujesz dla wybranych klas. Albo możesz podawać wskaźnik na funkcję do funkcji sumującej.

1

Pachnie troszkę problemem XY.
Ale na siłę się da:

template<typename T>
void sum(T f)
{
     uniwersalSum  = std::accumulate(Objects.begin(), Objects.end(), 0, [f](auto sum, const auto& item) { return sum + f(item); });
}

Bez szablonów też można:

class A {
...
void sum(int (B::*field)())
{
    uniwersalSum  = std::accumulate(Objects.begin(), Objects.end(), 0,
        [field](auto sum, auto& item) { return sum + (item.*field)(); });
}
...
};

A a;
a.sum(&B::geta);

https://wandbox.org/permlink/WZlf1CGlYhdksQSS

1 użytkowników online, w tym zalogowanych: 0, gości: 1