2011-12-29 8 views
5

Eventuali duplicati:
C++ templates that accept only certain typesPossiamo definire una funzione modello solo per alcuni tipi di dati?

Per esempio, se vogliamo definire una funzione template che possiamo usare gli interi, galleggianti, doppie, ma non stringhe. C'è un modo semplice per farlo?

+0

Per quanto ne so, non in C++ anche in C++ 11, ma le vecchie funzionalità rimosse riguardanti i concetti fanno ciò che volete se ricordo bene. – Geoffroy

+0

@Geoffroy: non esiste un supporto di livello linguistico di base per questo, ma utilizzando enable_if può essere fatto (vedere la mia risposta). Può essere un po 'macchinoso, ma posso immaginare alcuni tipi di helper che potrebbero dare questa sintassi più bella in C++ 2011 usando modelli variadic (non ho ancora sperimentato questo, tuttavia). –

+0

Vuoi applicare la stessa definizione per i tipi supportati o devi definirla in modo diverso per ognuno? cioè 'f ' ha esattamente lo stesso corpo di 'f '? –

risposta

8

Il modo per utilizzare questa funzione per utilizzare std::enable_if in una forma o in una forma. Il selettore per il tipo supportato viene quindi utilizzato come tipo di ritorno. Per esempio:

template <typename T> struct is_supported { enum { value = false }; }; 
    template <> struct is_supported<int> { enum { value = true }; }; 
    template <> struct is_supported<float> { enum { value = true }; }; 
    template <> struct is_supported<double> { enum { value = true }; }; 

    template <typename T> 
    typename std::enable_if<is_supported<T>::value, T>::type 
    restricted_template(T const& value) { 
    return value; 
    } 

Ovviamente, si vuole dare i tratti un nome migliore di is_supported. std::enable_if fa parte di C++ 2011 ma è facilmente implementato o ottenuto da boost nel caso in cui non sia disponibile con la libreria standard che si sta utilizzando.

In generale, spesso non è necessario imporre restrizioni esplicite in quanto l'implementazione del modello presenta in genere limitazioni implicite. Tuttavia, a volte è utile disabilitare o abilitare determinati tipi.

0

In genere la whitelist di alcuni tipi limita molto l'utilizzo dei modelli.

Boost si chiama così concepts che sono fondamentalmente interfacce per i modelli. invece di inserire nella whitelist alcuni tipi, è possibile creare errori in fase di compilazione se determinate condizioni (funzioni mancanti o con argomenti errati ecc.) Non sono soddisfatte. ovviamente puoi anche usarlo per limitare gli argomenti del tuo template a determinati tipi.

Problemi correlati