2012-12-17 13 views
8

Si consideri il seguente codice:Forzare un sovraccarico specifico quando template

#include <iostream> 
#include <vector> 
#include <type_traits> 

// Version A 
template<typename T> 
void f(const T& x) 
{ 
    std::cout<<"Version A"<<std::endl; 
} 

// Version B 
template<template<typename> class T, typename T1> 
void f(const T<T1>& x) 
{ 
    std::cout<<"Version B"<<std::endl; 
} 

// Main 
int main(int argc, char* argv[]) 
{ 
    f(double()); 
    f(std::vector<double>()); // <- How to force the use of version B ? 
    return 0; 
} 

Per impostazione predefinita, produrrà:

Version A 
Version A 

come forzare l'utilizzo del Version B quando il tipo di passato è un modello template con la buona forma (posso aggiungere nuove versioni di f, posso aggiungere std::enable_if o altra sintassi dei caratteri di tipo C++ 11, ma se possibile vorrei evitare di aggiungere una classe helper)?

risposta

11

std::vector non accetta un singolo parametro typename, ci vuole 2! Non dimenticare l'allocatore.

Quindi, utilizzare i modelli variadic:

template<template<typename...> class T, typename T1> 
void f(const T<T1>& x) 
{ 
    std::cout<<"Version B"<<std::endl; 
} 

Ora funziona come si desidera.

1

Come illustrato da Pubby in his answer, std :: vector è un modello con due parametri, pertanto la funzione di sovraccarico richiede più parametri del modello. Se non si desidera utilizzare modelli variadic, è necessario impostare il numero corretto di parametri:

#include <iostream> 
#include <vector> 
#include <type_traits> 


// Version A 
template<typename T> 
void f(const T&) 
{ 
    std::cout<<"Version A"<<std::endl; 
} 

// Version B 
template<template<typename,typename> class T, typename T1,typename T2> 
void f(const T<T1,T2>&) 
{ 
    std::cout<<"Version B"<<std::endl; 
} 

template<typename T> 
void baa(const T&) 
{ 
} 

// Main 
int main() 
{ 
    f(double()); 
    f(std::vector<double>()); // <- How to force the use of version B ? 
} 
Problemi correlati