2017-07-22 2 views
1

J'essaie de sélectionner un modèle de classe basé sur un paramètre de modèle d'énumération donné (type_stockage). Maintenant, j'instancie une classe qui l'utilise, mais il semble toujours essayer d'instancier le basic_store pour cette classe.Sélection du modèle de classe de temps de compilation par le paramètre de modèle d'énumération

enum store_type 
{ 
    none, 
    basic, 
    lockless, 
}; 

template<class T, store_type S = none, typename = void> 
struct get_store_type 
{ 
}; 

template<class T> 
struct get_store_type<T, basic, 
typename std::enable_if<!std::is_abstract<T>::value>::type> 
{ 
    using store_type = typename basic_store<T>; 
}; 

template<class T> 
struct get_store_type<T, lockless> 
{ 
    using store_type = typename lockless_store<T>; 
}; 

template<typename T, store_type S> 
class client 
{ 
public: 
    using my_store_type = typename get_store_type<T, S>::store_type; 
} 

//Tries to instantiate a basic store... which is not allowed. 
client<SomeAbstractType, lockless> something; 

Répondre

3

Vous avez oublié l'argument de modèle dans la spécialisation.

template<class T> struct get_store_type<T, lockless, void > 
                ^^^^ 

La sortie du code suivant est , et :

#include <iostream> 

enum store_type { none, basic, lockless }; 

template<class T, store_type S = none, typename = void> 
struct get_store_type 
{ int a = 1; }; 

template<class T> 
struct get_store_type<T, basic, typename std::enable_if<!std::is_abstract<T>::value>::type> 
{ int b = 2; }; 

template<class T> 
struct get_store_type<T, lockless, void > 
{ int c = 3; }; 

struct Any{}; 

int main(void) 
{ 
    get_store_type<int> storeA; 
    get_store_type<Any, basic> storeB; 
    get_store_type<int, lockless> storeC; 

    std::cout << storeA.a << std::endl; 
    std::cout << storeB.b << std::endl; 
    std::cout << storeC.c << std::endl;  

    return 0; 
} 
+0

Ofcourse! merci, regardait cela depuis des lustres: P. –

+0

@AndreasLoanjoe Vous êtes les bienvenus. – Rabbid76

+1

Comment l'accepter? Voulez-vous dire que je devrais upvote? Parce que je l'ai fait. EDIT: NVM l'a obtenu, il est accepté! –