2012-07-05 19 views
9

Szukałem czegoś innego związanego z parametrami szablonów szablonów i wydarzyło się po this answer, które twierdzi, że parametry szablonów szablonów szablonów są , a nie dozwolone przez standard.Czy szablon szablonu szablonu jest rozszerzeniem lub częścią standardu?

Jednakże następujący kod kompiluje w najnowszym brzękiem (3.2) i najnowszym GCC (4.8):

template<template<template<typename> class> class T> struct test {}; 
template<template<typename> class T> struct foo {}; 
test<foo> bar; 

Jest to rozszerzenie, czy jest inna odpowiedź faktycznie błędne i jest to dozwolone przez standard? Jeśli nie, czy istnieje jakiś szczególny powód takiego pominięcia?

+0

@chris OP oznacza prawdopodobnie migawkę 4,8. Używam go przez jakiś czas. – juanchopanza

+0

Tak, mam zdjęcia z MacPorts ... więc, prawdopodobnie nie najnowsze svn lub coś w tym stylu. – celticminstrel

+0

to także kompiluje na gcc 4.5 na Ideone http://ideone.com/BUAuw – TemplateRex

Odpowiedz

8

W std::vector<int> szablon klasy std::vector jest przekazywany jako typ int. W std::get<42>(some_tuple), szablon funkcji std::get jest przekazywany jako wartość parametru 42. Niewykluczone, że poprzedni rodzaj argumentu jest nazywany argumentem typu szablonu (lub typu szablonu), podczas gdy drugi rodzaj jest argumentem (szablonowym) nietypowym.

Szablony mogą jednak przyjmować inny rodzaj argumentów: inne szablony. Na przykład template<template<typename> class T> void foo(); deklaruje szablon funkcji przyjmujący szablon jako argument, który sam przyjmuje argument typu. (Na marginesie, podczas gdy szablony nie są typami, termin "argument nie typu" wciąż nie obejmuje argumentów szablonu szablonu, jest on zarezerwowany dla argumentów takich jak .)

Ponieważ nie ma czegoś takiego jak szablon szablonu w C++ (istnieją szablony klas, funkcji i aliasów - ale tak czy inaczej są one po prostu "szablonami"), nie ma czegoś takiego jak szablon szablonu szablonu. To, co masz, jest wynikiem parametru szablonu szablonu młyna, w którym oczekiwany argument szablonu zawiera sam szablon szablonu. Nie mogę znaleźć odniesienia w Standardzie, które zabrania tego, podobnie jak w odpowiedzi na link.

Powiązane problemy