Jeśli muszę zdefiniować szablon foo
funkcję z parametrem szablonu szablonu, zazwyczaj należy wykonać następujące czynności:Czy istnieje stosowanie nazwanych parametrów do szablonu szablonu Parametry
// Notice that the template parameter of class T is unnamed.
template <template <typename> class T> void f() { std::cout << "Yay!\n"; }
Zauważ, że parametr Wzór parametr szablonu szablon jest bezimienny, ale możemy przypisać nazwę tego parametru:
// Now the template parameter of class T is named INNER.
template <template <typename INNER> class T> void f(const INNER &inner)
{ std::cout << inner << " Yay!\n"; }
nie wydaje się być przydatna w ogóle, bo nie mogę reffer parametr w funkcji INNER
, powyższy kod produkuje następujące Błąd:
error: 'INNER' does not name a type
Zaskakuje mnie, że typename INNER
nie nazwę typu, po wszystkich słów kluczowych typename
jest tam w celu nazywania typ. W każdym razie, jest to łatwe do naprawienia choć:
// Now INNER is the name of the template parameter of class T and also
// the name of the second template parameter of foo.
template <template <typename INNER> class T, typename INNER> void f(const INNER &inner)
{ std::cout << inner << " Yay!\n"; }
// ...
f<std::valarray, int>(666); // Prints "666 Yay!"
Ale w końcu, parametr INNER
nie potrzebuje nazwy po wszystko:
// Now the template parameter of class T is unnamed one more time,
// INNER is the name of the second template parameter of foo.
template <template <typename> class T, typename INNER> void f(const INNER &inner)
{ std::cout << inner << " Yay!\n"; }
// ...
f<std::valarray, int>(666); // Prints "666 Yay!"
oraz (na pewno już zauważył przed sobą) nazwa w parametrze parametru szablon-szablon jest ignorowana! To na pewno zostało zignorowane, ponieważ jeśli nie, powinno to być zderzenie nazwy z drugim parametrem szablonu foo
, czyż nie?
Kolejna demonstracja nazwą parametru parametru szablonu szablonów są ignorowane:
// Now T is the name of the template parameter of class T and also
// the name of the template parameter of foo!
template <template <typename T> class T> void f()
{ std::cout << "Yay!\n"; }
// ...
f<std::valarray>(); // prints "Yay!"
typ nazwany T
jest używany przez parametr szablonu szablonu i szablonu-szablonu samego Pod w tym samym czasie? Nie sądzę, nazwa do parametru szablonu szablonu jest ignorowana AFAIK.
Jakie jest pytanie?
- Czy moje przypuszczenia są prawidłowe? Nazwy nazwanych parametrów szablonu parametrów szablon-szablon są ignorowane?
- Jeśli się mylę i źle zrozumiałem całą sprawę, użycie nazwanych parametrów w parametrach szablonu szablonu jest użyteczne? Czy możesz podać kilka użytecznych przykładów?
chodzi o przydatnych przykładów na # 2 Mam na myśli coś, co można osiągnąć tylko za pomocą nazwanych parametrów szablonu parametrów szablonu szablonów.
myślę przeczytaniu tego QA: http://stackoverflow.com/questions/213761/what-are-some-uses-of-template-template-parameters-in-c pomoże przewodnik dlaczego nie byłoby żadnego pożytku z nazwania parametru szablonu-szablonu.TTP w gruncie rzeczy deklarują podpis wzorcowego argumentu, nie dostarczając metody szablonowej dodatkowych argumentów szablonu. Podobnie jak przy deklarowaniu funktora, jest to '(* foo) (typ, typ typu)', a nie '(* foo) (nazwa typu, nazwa typu, nazwa typu)'. – aruisdante