Предположим, у меня есть шаблон (называемый ExampleTemplate), который принимает два аргумента: тип контейнера (например, список, вектор) и содержащийся тип (например, float, bool и т.д.). Поскольку контейнеры на самом деле являются шаблонами, этот шаблон имеет параметр шаблона. Вот что я должен был написать:
#include <vector>
#include <list>
using namespace std;
template < template <class,class> class C, typename T>
class ExampleTemplate {
C<T,allocator<T> > items;
public:
....
};
main()
{
ExampleTemplate<list,int> a;
ExampleTemplate<vector,float> b;
}
Вы можете спросить, что такое "распределитель". Ну, вначале я пробовал очевидную вещь...
template < template <class> class C, typename T>
class ExampleTemplate {
C<T> items;
};
... но я, к сожалению, обнаружил, что аргумент по умолчанию для распределителя...
vector<T, Alloc>
list<T, Alloc>
etc
... должен был быть явно "зарезервирован" в объявлении шаблона. Это, как вы видите, делает код более уродливым и заставляет меня воспроизводить значения по умолчанию аргументов шаблона (в данном случае - распределителя).
Что такое BAD.
РЕДАКТИРОВАТЬ: Вопрос не в конкретной проблеме с контейнерами - речь идет о "значениях по умолчанию в шаблонах с аргументами шаблона", и приведенное выше является всего лишь примером. Ответы, зависящие от знания того, что контейнеры STL имеют значение ":: value_type", не соответствуют мне. Подумайте об общей проблеме: если мне нужно использовать аргумент шаблона C в шаблоне ExampleTemplate, то в теле ExampleTemplate мне нужно воспроизвести аргументы по умолчанию C, когда я его использую? Если мне это нужно, не вводит ненужные повторения и другие проблемы (в этом случае, где C является контейнером STL, проблемы с переносимостью - например, "распределитель" )?