2016-07-05 4 views
18

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

int main() 
{ 
    func<vector>(/*some arguments*/); 
} 

То есть, я хочу, чтобы пользователь, чтобы иметь возможность указать контейнер без указания типа, в котором он работает.

Например, некоторые (мета) код (который не работает с выше), которые могли бы определить func будет выглядеть следующим образом:

template<typename ContainerType> 
int func(/*some parameters*/) 
{ 
    ContainerType<int> some_container; 
    /* 
     operate on some_container here 
    */ 
    return find_value(some_container); 
} 
+6

Ну, у вас уже есть ответ в заголовке вопроса ... –

+0

@dasblinkenlight: Это в высшей степени возможно. Вам нужен параметр шаблона шаблона, точно так же, как говорит OP в вопросе. –

+0

Обратите внимание, что в то время как параметры шаблона шаблона существуют, они редко являются правильным способом параметризации вещей. Как правило, гораздо лучше параметризировать тип и извлекать функции типов через признаки. –

ответ

23

Синтаксис является

template <template <typename...> class ContainerType> 
int func(/*some parameters*/) 
{ 
    // Your code with ContainerType<int> 
} 

Примечание: class не может быть заменен на typename (до C++ 17).

Вы не можете просто использовать typename вместо typename... Поскольку std::vector принимает типа и Allocator (дефолт): std::vector<T, Allocator>

+5

Из C++ 17 'typename' будет в порядке. – songyuanyao

9

Попробуйте это:

template<template<typename,typename> class ContainerType> 
int func (/*some parameters*/) 
{ 

} 

Вам нужны два внутренних параметры шаблона, так как std::vector определяются как:

template < class T, class Alloc = allocator<T> > class vector;

Смежные вопросы