Zeiger auf Klasse als template-parameter
Möchte ich einen Zeiger auf eine Klasse als template-parameter ein, wie in:
template <class Class, class Result, Result Class::*Member>
struct MyStruct {
//...
};
Verwendung dieser Struktur wie MyStruct<SomeClass, SomeResult, &SomeClass::value> variable
funktioniert Prima, aber ich mag es nicht, dass ich angeben SomeClass
und SomeResult
.
Möchte ich MyStruct<&SomeClass::value> variable
wenn das möglich ist, aber ohne die Fähigkeit zu übergeben, jede Klasse und jedes Ergebnis geben.
Ich habe Folgendes versucht, aber die syntax ist unzulässig:
template <class Class, class Result>
template <Result Class::*Member>
struct MyStruct {
//...
};
Fehler: zu viele template-parameter-Listen
Versuchte ich mit einem helper-Funktion (das funktioniert tatsächlich in die Klappern aber verweigert wird von GCC):
template <class Class, class Result>
static constexpr auto makeMyStruct(Result Class::*member) ->
MyStruct<Class, Result, member> {
//...
}
Fehler: die Verwendung des Parameters `Mitglied' außerhalb der Funktion Körper
error: template argument 3 ist ungültig
Ist es möglich, eine einfache MyStruct<&SomeClass::value>
, und wenn ja, wie?
Verwandte Frage, die sich nicht lösen, meine Frage:
- Dup? stackoverflow.com/questions/5628121/...
- Ich bin mir nicht sicher, ob meine Frage läuft darauf hinaus, dass andere Frage. Meins ist weit mehr schmal, und ich würde auch nicht gerne mit einem makro.
- Der Begriff ist ein Zeiger-auf-member, keinen Bezug zum Mitglied. Referenzen und Zeiger sind ganz anders in der Sprache (naja, nicht, dass die verschiedenen, aber immer noch nicht das gleiche)
- Das Problem mit dem Helfer-Funktion ist die Nutzung der runtime-Wert
member
als ein template-argument, die bekannt sein müssen zur compile-Zeit zu instanziieren Sie das template. Wenn Sie sich ändern konnten MyStruct zu nehmen, dieResult Class::*member
als Konstruktor-parameter anstelle des template-Parameters, dann funktioniert es einwandfrei. - Sie fehlen den Punkt ... isocpp.org/files/papers/n3601.html schlägt eine Lösung für das problem.
- Ich Verstand, was Sie versuchen zu erreichen & wie N3601 bietet Ihnen eine Lösung. Ich wollte hinzufügen für den nutzen anderer zu besuchen (und Sie, falls Sie nicht bewusst waren), warum die Helfer Funktion nicht kompilieren. Ich bin verwirrt durch das Geräusch, es anzunehmen, obwohl...
- Ich nicht zu erwähnen, richtig, aber das argument der ctor sollte zur Kompilierzeit bekannt ist. Wie in
auto x = makeMyStruct(&SomeStruct::some_member);
. N3601 kommt in handliches in diesem Fall.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies könnte eine Lösung in C++11:
Können Sie definieren folgende Allgemeine Merkmale Typ:
Legen Sie nun eine zusätzliche, 4-line-wrapper-makro für jedes struct:
... und verwenden Sie es in der folgenden Weise:
Ich benutze dies als eine Zwischenlösung, bis wir den Wechsel zu C++17.
_MyStruct<
out of place?Antwort auf meine Frage war im vorliegenden Papier vorgeschlagen werden für den nächsten C++ - standard:
Diese syntax wurde vorgeschlagen:
Die Notwendigkeit für eine neue syntaktische Konstrukt gibt an, dass Sie nicht tun, indem jetzt.
Ich hoffe n3601 akzeptiert werden. 🙂
In c++17, mit dem Zusatz von
auto
im template-Argumente (P0127), glaube ich, können Sie jetzt tun:Stellen Sie Ihr Ergebnis der Klasse ein Kind Ihrer Vorlage-Klasse. vorausgesetzt, die pointer-member wird ein Objekt von Ihr Ergebnis der Klasse in der öffentlichkeit oder was auch immer, können Sie auf alle Objekte aus, indem Sie so etwas wie dieses