2013-04-13 5 views
21

Ich las this und versuchte zu verstehen, was N3601 war. Es sagte, dass dieses Idiom in einer Web-Suche viel auftaucht, aber ich konnte nichts finden. Was ist dasWas ist die Vorlage <Typname T, T t> Idiom?

template<typename T, T t> 

Idiom, was es löst, wie es verwendet wird, was sind Implizite Template-Parameter, und was bedeutet der Vorschlag zu beheben Ziel?

+2

Beginnen Sie mit einer Vorlage 'Vorlage void foo (T t);'. Machen Sie diesen Parameter zu einem Kompilierzeitwert: 'template void bar();' (Ich glaube, Sie meinten das anstelle von 'class'). Denken Sie jetzt darüber nach, wie Sie 'foo (5);' nennen können, damit T ein 'int' ist, aber um das mit' bar' zu tun, benötigen Sie 'bar ();'. Geht das in die richtige Richtung? – chris

+0

Ich meinte T t, nicht Klasse T. Das behoben. –

+0

@chris Ich sehe was du jetzt gehst. bar muss für jeden Typ, den wir ihm geben, generisch sein, nimmt aber auch einen Wert desselben Typs wie ein anderer Template-Parameter an. Wir müssen sowohl den Typ als auch den Wert angeben, um daraus abzuleiten, dass 5 ein int ist. Der Vorschlag zeigt eine Verwendung von diesem in einer Reflektionsbibliothek, aber ich habe es bis heute nie gesehen. Wie sonst kann das benutzt werden? –

Antwort

15

Das Problem, das gelöst wird, ist das Ableiten von Typen aus Nicht-Typparametern.

Gegeben:

template<typename T> void foo(T); 
template<typename T, T> void bar(); 

es möglich ist, T für foo abzuleiten (Beispiel für, wird foo(10) in T führen abgeleitet werden int sein), aber es ist nicht möglich, T für bar abzuleiten (bar<10>() wird einfach nicht kompilieren, Sie müssen es als bar<int,10>() schreiben).

N3601 schlägt Festsetzung dies durch die Syntax Einführung:

template<using typename T, T> void bar(); 

die bar<10>() erlauben zu kompilieren und führen T die Art abgeleitet werden.

5

Das Papier Einführung ist irreführend: das Idiom ist eigentlich

template <typename T, T t> 

Es bezeichnet eine Vorlage, die auf einer Art T und einen Wert t dieses Typs abhängt. Die Schreibweise ist ein wenig schwer, da der Typ in den meisten Situationen aus dem Wert selbst abgeleitet werden kann.

z.

// the current definition notation 
template <typename T, T t> void f() { t.f(); }; 

//// the proposed definition notation 
//// the parameter t depends on an implicit typename parameter T 
// template <using typename T, T t> void f() { t.f(); }; 

struct foo { 
    void f(){ 
     // some computation 
    } 
}; 

foo bar; 

int main(){ 
    // the current instantiation notation 
    f<foo,bar>(); 
    //// the proposed instantiation notation 
    //// we know that bar is of type foo, so we don't need to specify it 
    // f<bar>(); 
} 

Bei dem Vorschlag geht es darum, etwas "syntaktischen Zucker" einzuführen, um die Schreibweise einfacher zu machen. Auch das oben angegebene Beispiel ist trivial in seiner Beschreibung (und möglicherweise falsch, da Template-Parameter constexpr sein müssen), aber das Papier beschreibt mehrere Situationen, in denen die aktuelle Notation ziemlich behaart werden kann, was die Lesbarkeit und die allgemeine Leichtigkeit der Programmierung.

+0

Interesse haben und der Wert "t" dieses Typs muss eine ganzzahlige Konstante sein, oder ein Zeiger, weil nichts anderes in Template-Argumente erlaubt ist. –

Verwandte Themen