2015-03-11 21 views
7

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?

  1. Czy moje przypuszczenia są prawidłowe? Nazwy nazwanych parametrów szablonu parametrów szablon-szablon są ignorowane?
  2. 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.

+0

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

Odpowiedz

8

[basic.scope.temp]/p1:

The declarative region of the name of a template parameter of a template template-parameter is the smallest template-parameter-list in which the name was introduced.

(Teraz spróbuj powiedzieć, że 10 razy).

Może być używany wewnątrz tej listy. Na przykład,

template < template<class T, T t> class TP > class foo {}; 
//       ^^-----T's scope ends here 
//       | 
//       T can be used here 

foo<std::integral_constant> bar; 
+0

To bardzo podobne do deklaracji funkcji, nawiasem mówiąc. Poniżej przedstawiono analogię, tworząc błąd kompilatora: "void f (int x, decltype (x)); int main() {f (1, nullptr); } '. Następujące kompiluje i łączy drobne: 'void f (int x, decltype (x)); int main() {f (1, 1); } void f (int, int) {} '. Jest tak dlatego, że zakres 'x' jest wystarczający, aby objąć' decltype', który pojawia się po nim. –

+0

OK, więc się pomyliłem: nazwany parametr parametru szablon-szablon nie jest ignorowany, po prostu nie istnieje poza jego szablonem-szablonem klasy ... jedynym wykorzystaniem jakie mogę wymyślić nazwanymi parametrami szablonu szablonu jest następujący: 'szablon > klasa V> klasa f {};' –

Powiązane problemy