2016-07-05 94 views
18

Voglio sapere se è a tutto il possibile per avere il codice che ha il seguente comportamento:parametri di modello Template senza specificare il tipo interno

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

Cioè, voglio che l'utente sia in grado di specificare il contenitore senza specificare il tipo su cui opera.

Ad esempio, un codice (meta) (che non funziona con quanto sopra) che potremmo definire func sarebbe come segue:

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

Bene, hai già la risposta nel titolo della domanda ... –

+0

@dasblinkenlight: Questo è eminentemente possibile. Hai bisogno di un parametro template template, esattamente come dice l'OP nella domanda. –

+0

Si noti che mentre i parametri del template template esistono, raramente sono il modo giusto per parametrizzare le cose. Di solito è molto meglio parametrizzare sul tipo ed estrarre le caratteristiche dei tipi tramite tratti. –

risposta

23

La sintassi è

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

Nota: class non può essere sostituito da typename (fino a C++ 17).

Non si può semplicemente utilizzare typename invece di typename... Perché std::vector prende Tipo e Allocatore (default): std::vector<T, Allocator>

+5

Da C++ 17 'typename' andrebbe bene. – songyuanyao

9

Prova questo:

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

} 

Hai bisogno di due parametri di modello interne dal std::vector è definito come:

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