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, die Result 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.

InformationsquelleAutor kay | 2013-03-01
Schreibe einen Kommentar