Wie kann ich Code zwischen einer spezialisierten und nicht spezialisierten Version einer C++ - Klasse freigeben?Freigeben von Code zwischen einer spezialisierten und nicht spezialisierten Templatestruktur
Hier ist ein konstruiertes Beispiel dafür, was ich versuche zu erreichen:
mit zur Verbindungszeit#include <iostream>
using namespace std;
template <size_t n> struct Y {
int one() { return 1; }
int two();
};
template <> struct Y<1> {
int one() { return 11; }
int two();
};
template <size_t n> int Y<n>::two() { return one() * 2; }
int main() {
Y<1> X;
cout << X.one();
cout << X.two();
return 0;
}
Dies schlägt fehl:
Undefined symbols for architecture x86_64:
"Y<1ul>::two()", referenced from:
_main in test-7c4ebe.o
Allerdings, wenn ich die Y<1> X;
-Y<2> X;
ändern, Kompilierung erfolgreich Alles gut.
Mein Ziel hier war die Verwendung der Beispielimplementierung von two()
für die spezialisierte und unspezialisierte Version der Klasse.
konnte ich wie so um dieses Problem mit Vererbung erhalten:
#include <iostream>
using namespace std;
struct mixin {
virtual int one() = 0;
int two() { return one() * 2; }
};
template <size_t n> struct Y : public mixin {
int one() { return 1; }
};
template <> struct Y<1> : public mixin {
int one() { return 11; }
};
int main() {
Y<1> X;
cout << X.one();
cout << X.two();
return 0;
}
Aber ich denke, dass bei jedem Aufruf von Y<n>.two()
, rechts eine unnötigen v-Lookup-Tabelle verursacht?
Gibt es eine Möglichkeit, Code zwischen der spezialisierten und unspezialisierten Version freizugeben, ohne die Vererbung zu missbrauchen und einen V-Table-Lookup-Aufruf auszuführen?
define * missbrauchen * in Erbschaft. – SergeyA
@SergeyA scheint mir, dass diese Vielzahl von Problemen lösbar sein sollte, ohne Vererbung zu verwenden, obwohl, wenn es eine Lösung gibt, die Vererbung verwendet, aber eine V-Tabellen-Suche vermeidet, das in Ordnung wäre. –
@SergeyA: OK, ich missverstanden. – AnT