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.
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
Ich meinte T t, nicht Klasse T. Das behoben. –
@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? –