2017-02-19 20 views
0

я обнаружил, что следующий код компилируется и успешно работает с VS 2015:VARIADIC шаблон в качестве параметра шаблона без расширения пакета

template<typename T, template <typename ...> class Container > 
struct Holder 
{ 
    Container<T> container_; 
}; 

int main() 
{ 
    Holder<int, std::vector> h; 
    h.container_.push_back(10); 
    std::cout << h.container_.at(0); 
} 

Не могли бы вы сказать мне, следует ли таким образом стандарт, чтобы указать на template- параметр шаблона без перечисления типов параметров (тип элементов контейнера и тип распределителя в приведенном выше примере)?

+0

Что это значит _whether этот путь следует за standard_? Это разрешено, вот и все. Вы хотите знать, что библиотека стандартного шаблона что-то делает? Вопрос довольно неясен. – skypjack

+0

Спасибо, я хочу знать, разрешено ли использовать вариационный шаблон таким образом (или это некоторая функция MS C++ non-stadard). –

+1

Пока 'Container' не имеет каких-либо параметров шаблона непигового типа, он будет работать, и он будет стандартным (я использую его с GCC и Clang уже несколько лет). Только более старые версии некоторых компиляторов терпят неудачу, но это ошибка в этих компиляторах. –

ответ

1

Я хочу знать, если это разрешено использовать VARIADIC шаблон таким образом (или это какой-то MS C++, не Stadard функции)

В соответствии с standard (рабочий проект, но то же самое относится и к C++ 11/C++ 14), это абсолютно правильный код. Стандарт содержит также несколько примеров использования, как следующий:

template <class T> struct eval; 

template <template <class, class...> class TT, class T1, class... Rest> 
struct eval<TT<T1, Rest...>> { }; 

Вам нужен параметр обновления для контейнера, так как некоторые из них, определенных в стандартной библиотеке шаблонов принимают более одного аргумента (хотя и почти все из этих параметров имеет значение по умолчанию).
В качестве примера, контейнер используется в вашем ваш код объявлен как:

template<class T, class Allocator = std::allocator<T>> class vector; 

Поэтому следующий бы не было подкреплено:

template<typename T, template <typename> class Container> struct Holder;