Z
Muss den Thread nochmal hoch pushen.
Leider konnte ich keine Lösung für den Defaultwert des Funktionspointers finden, daher bin ich zunächst nochmal den Weg mit den Variadic Templates gegangen.
Jetzt stehe ich aber vor dem nächsten Problem: Was ist, wenn ich einen builtin Typ ebenfalls ermöglichen möchte (z.B. einen int).
template <typename T1, typename T2, void (T1::* ...FUNC)(const T2&)> struct list; // Allgemeine Version, wird nie definiert
template <typename T1, typename T2> struct list<T1, T2> { }; // Partielle Spezialisierung für 2 Argumente...
template <typename T1, typename T2, void (T1::*FUNC)(const T2&) > struct list<T1, T2, FUNC> { }; // ... und für drei Argumente
#include <string>
class person;
class address
{
std::string street;
int number;
public:
void resident(const person &p);
};
class person
{
std::string name;
// NEU: builtin type
list<int, person> integers;
// mit Relationstabelle
list<address, person> addresses1;
// ohne Relationstabelle
list<address, person, &address::resident> addresses2;
};
Natürlich meckert hier der Compiler, dass er für einen builtin Typ keinen Funktionspointer anlegen kann. jetzt überlege ich, wie man die allgemeine Version dahingehend erweitern kann, dass sie auch bei builtins funktioniert.
Leider kann man ja keine "Template Erweiterung" machen, sondern nur eine Spezialisierung
@camper und SeppJ: habt ihr noch einen guten Einfall?
EDIT: Es ist auch OK, wenn das Ergebnis ist, dass das so nicht geht!
Gruß,
zussel
BTW: Wenn man eine eigene Bibliothek schreibt und einen Listenklasse anbietet möchte, die die gleiche Schnittstelle bietet, wie die STL Liste, ist es dann ok, wenn man diese Klasse auch "list" nennt (natürlich in einem eigenen Namspace).