Rozważmy następujące dwie klasy:szablonu zmienną członkiem
class LunchBox
{
public:
std::vector<Apple> m_apples;
};
i
class ClassRoom
{
public:
std::vector<Student> m_students;
};
Klasy są podobne w tym, że oba zawierają członek zmienny wektor obiektów; jednak są one różne, ponieważ obiekty wektorowe są różne, a zmienne składowe mają różne nazwy.
chciałbym napisać szablon, który zaczyna albo LunchBox
lub ClassRoom
jako argument szablonu (lub jakiegoś innego parametru) oraz istniejącego obiektu tego samego typu (podobne do std::shared_ptr
). Szablon zwróci obiekt dodający funkcję składową getNthElement(int i);
, aby poprawić dostęp do metod. Wykorzystanie byłoby jak:
// lunchBox is a previously initialized LunchBox
// object with apples already pushed into m_apples
auto lunchBoxWithAccessor = MyTemplate<LunchBox>(lunchBox);
auto apple3 = lunchBoxWithAccessor.getNthElement(3);
Chciałbym zrobić to bez specjalizacje pisanie szablonów dla każdej klasy (które prawdopodobnie będzie wymagać określające zmienną składową do działania na w pewnym sensie). Najlepiej nie chcę modyfikować klas LunchBox
lub ClassRoom
. Czy można napisać taki szablon?
Wolałbym unikać specjalizacji szablonu, jeśli to możliwe. Czy nie ma na to sposobu? Dziękuję za odpowiedź! – chessofnerd
@chessofnerd Nie, chyba że chcesz zastosować metodę dostępową bezpośrednio w menu 'LunchBox' lub' ClassRoom'. Musi być jakiś sposób sprawdzenia akcesora dla danego 'T'. – cdhowie
Tego właśnie się bałem. Miałem nadzieję, że możesz zrobić coś takiego jak "auto accessorizedLunchBox = Accessor (lunchBox)', aby określić zmienną składową do działania. Czy istnieje poparcie dla takiej składni? Byłbym zaskoczony, gdyby tak było. –
chessofnerd