Ich habe eine Vorlage struct SFoo
, die ein Mitglied struct enthält SZug
:C++: Teilweise spezialisiert Vorlage des Typ-Parameter als ein anderes Mitglied-Typ der Template-Klasse
template <typename tTYPE>
struct SFoo
{
struct SZug {};
};
ich eine andere Struktur haben SBar
, die einen Typ Parameter nimmt:
template <typename tTYPE>
struct SBar
{ /* stuff */ };
ich möchte SBar
mit SZug
für den Typ-Parameter spezialisieren, etwa so:
template <typename tTYPE>
struct SBar<typename SFoo<tTYPE>::SZug>
{ /* different stuff */ };
Dies lässt sich nicht kompilieren - LLVM Ausgänge:
nicht ableitbar Template-Parameter 'TTYPE'
Während ein Compiler dies leicht, wenn es gewünscht ableiten könnte, ich vermute, es ist nur dass die C++ - Spezifikation diesen Fall spezifisch abdecken müsste.
Gibt es eine Möglichkeit, dies zu erreichen?
. (Anmerkung: Im Moment arbeite ich um es von SZug
außerhalb von SFoo
bewegt und eine using
Meldung ab, aber es ist hässlich)
Was haben Sie danach vor? Es ist mir nicht klar, was Sie von der "Spezialisierung" erwarten. Können Sie uns zeigen, wie Sie eine Variable des nichtspezialisierten und spezialisierten 'SBar' deklarieren würden? – Holt
Ich verwende diese rein als Merkmalstypen, so dass sie nie tatsächlich instanziiert werden. Bar bietet einfach einen consExpr Mitgliedszeiger für eine andere (nicht erwähnte) Klasse (plus ein paar andere Dinge). Normalerweise muss der Member-Pointer explizit angegeben werden, aber für die 'SZug'-Spezialisierung kann er bestimmt werden. - (Letztendlich hat dies alles damit zu tun, generische eingebettete N-zu-N-Container aus 1-zu-N-generischen Containern zu generieren - der Member-Pointer zeigt auf die Container- oder Knoten-Information "embedded" (dh eine Member-Variable) im Benutzer Art). – xaxazak
I Sie können leicht 'SZug' geändert werden, um es zu erkennen, es ist ziemlich einfach zu tun, was Sie wollen, mit SFINAE (siehe meine Antwort). Wenn Sie nicht können, bin ich nicht sicher, ob es eine Möglichkeit gibt zu erkennen, dass "tTYPE" die "SFoo :: SZug" -Klasse ist. –
Holt