2016-07-05 16 views
18

Chcę wiedzieć, czy jest to w ogóle możliwe, że kod, który ma następujące zachowanie:parametry szablonu Szablon bez podania wewnętrzną typu

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

Oznacza to, że chcę, aby być w stanie określić kontener bez określania typu, na którym działa.

Na przykład, niektóre (meta) kod (który nie działa z powyższych), które mogłyby określić func byłby następujący:

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

Cóż, już masz odpowiedź w tytule pytania ... –

+0

@dasblinkenlight: To jest wyjątkowo możliwe. Potrzebujesz parametru szablonu szablonu, dokładnie tak, jak mówi OP w pytaniu. –

+0

Należy pamiętać, że chociaż istnieją parametry szablonów szablonów, rzadko są one właściwą metodą parametryzowania. Zwykle lepiej jest parametryzować na typie i wyodrębniać cechy typów za pomocą cech. –

Odpowiedz

23

Składnia jest

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

Uwaga: class nie może być zastąpiony przez typename (do C++ 17).

Nie można po prostu użyć typename zamiast typename... Ponieważ std::vector trwa Wpisz i Allocator (niespłaconych): std::vector<T, Allocator>

+5

Od C++ 17 "typename" byłoby w porządku. – songyuanyao

9

Spróbuj tego:

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

} 

Trzeba dwa wewnętrzne parametry szablonu od std::vector jest zdefiniowany jako:

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

Powiązane problemy