Betrachten Sie die folgenden zwei Klassen:Vorlage eine Membervariable
class LunchBox
{
public:
std::vector<Apple> m_apples;
};
und
class ClassRoom
{
public:
std::vector<Student> m_students;
};
Die Klassen gleich sind, dass sie sowohl eine Membervariable Vektor-Objekte enthalten; Sie unterscheiden sich jedoch darin, dass die Objekte des Vektors unterschiedlich sind und die Elementvariablen unterschiedliche Namen haben.
Ich mag eine Vorlage schreiben, die entweder LunchBox
oder ClassRoom
als Templat Argument (oder einen anderen Parameter) und ein vorhandenes Objekt desselben Typs (ähnlich ein std::shared_ptr
) führt. Die Vorlage würde ein Objekt zurückgeben, das eine getNthElement(int i);
-Mitgliedsfunktion hinzufügt, um den Zugriff auf die Methoden zu verbessern. Usage wäre wie:
// lunchBox is a previously initialized LunchBox
// object with apples already pushed into m_apples
auto lunchBoxWithAccessor = MyTemplate<LunchBox>(lunchBox);
auto apple3 = lunchBoxWithAccessor.getNthElement(3);
Ich möchte diese ohne Schreiben Vorlage Spezialisierungen für jede Klasse tun (was wahrscheinlich die Membervariable würde erfordern die Angabe in irgendeiner Weise zu operieren). Vorzugsweise möchte ich die Klassen LunchBox
oder ClassRoom
nicht ändern. Ist das Schreiben einer solchen Vorlage möglich?
Ich würde es vorziehen, die Template-Spezialisierung möglichst zu vermeiden. Gibt es keinen Weg um es herum? Danke für die Antwort! – chessofnerd
@chessofnerd Nicht, wenn Sie die Accessor-Methode direkt auf 'LunchBox' oder' ClassRoom' implementieren möchten. Es muss einen Weg geben, den Accessor für ein gegebenes "T" nachzuschlagen. – cdhowie
Das war, wovor ich Angst hatte. Ich hatte gehofft, du könntest etwas wie 'auto accessorizedLunchBox = Accessor (lunchBox) 'machen, um die Membervariable anzugeben, die bearbeitet werden soll. Gibt es irgendeine Unterstützung für eine solche Syntax? Ich wäre überrascht, wenn es da wäre. –
chessofnerd