Ist es irgendwie möglich? Ich möchte, dass die Übergabe von Argumenten zur Kompilierzeit ermöglicht wird. Angenommen, es dient nur der Benutzerfreundlichkeit, da man immer den echten Typ eingeben könnte template<class T, T X>aber für einige Typen, zB Pointer-to-Member-Funktionen, ist es sogar mit ziemlich mühsam decltype als Abkürzung. Betrachten Sie den folgenden Code:
struct Foo{
template<class T, T X>
void bar(){
// do something with X, compile-time passed
}
};
struct Baz{
void bang(){
}
};
int main(){
Foo f;
f.bar<int,5>();
f.bar<decltype(&Baz::bang),&Baz::bang>();
}
Wäre es irgendwie möglich, es wie folgt umzuwandeln?
struct Foo{
template<auto X>
void bar(){
// do something with X, compile-time passed
}
};
struct Baz{
void bang(){
}
};
int main(){
Foo f;
f.bar<5>();
f.bar<&Baz::bang>();
}
@GMan: Aktualisiert, hoffe es macht jetzt mehr Sinn. 🙂
– Xeo
11. April 2011 um 22:27 Uhr
GManNickG
Nach deinem Update: nein. Eine solche Funktionalität gibt es in C++ nicht. Am nächsten sind Makros:
#define AUTO_ARG(x) decltype(x), x
f.bar<AUTO_ARG(5)>();
f.bar<AUTO_ARG(&Baz::bang)>();
Dies ist sogar noch nützlicher in C++0x, wo Sie verwenden können auto my_foo(make_foo(5)); ohne jemals den Typ benennen zu müssen foo<int> vollständig.
– James McNellis
11. April 2011 um 22:22 Uhr
Wenn das Übergeben des Arguments an eine Funktion ein Problem gewesen wäre, hätte Asker direkt verwenden können f.bar(5); und deklarieren Sie die Methode einfach als template<typename T>void bar(T &X);. Was nützt dir dein make_foo() ?
– iammilind
12. April 2011 um 3:30 Uhr
@iammilind: Es war eine alte Vermutung zu seiner Frage, bevor er klarstellte.
– GManNickG
12. April 2011 um 3:58 Uhr
@iamm: Die Ableitung von Vorlagenargumenten funktioniert nur mit Funktionen, nicht mit Klassen.
– Dennis Zickefoose
12. April 2011 um 4:02 Uhr
@Jonathan.: Ich glaube nicht, dass viele Dinge in der Sprache standardmäßig funktionieren, geschweige denn auto als Erweiterung auf zwei separate Vorlagenparameter.
– GManNickG
19. Mai 2016 um 15:54 Uhr
Es wurde in C++17 hinzugefügt. Jetzt können Sie schreiben
template<auto n> struct B { /* ... */ };
B<5> b1; // OK: non-type template parameter type is int
B<'a'> b2; // OK: non-type template parameter type is char
@GMan: Aktualisiert, hoffe es macht jetzt mehr Sinn. 🙂
– Xeo
11. April 2011 um 22:27 Uhr