Параметры шаблона шаблона без указания внутреннего типа

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

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);
}

Ответы

Ответ 1

Синтаксис

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

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

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

Ответ 2

Попробуйте следующее:

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

}

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

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