2017-01-11 3 views
4

Je voudrais pouvoir le faire:Déterminer le type de paramètre de modèle non de type

template <typename T x> 
struct Test { 
    T val{x}; 
}; 

int main() { 
    Test<3> test; 
    return test.val; 
} 

But I can't. Right?


Je répondais à une question here et j'utiliser le modèle suivant:

template <typename T, typename V, typename VP, V(T::*getf)(), void (T::*setf)(VP)> 

Chacun des types est spécifié manuellement. Mais c'est une duplication car T, V et VP sont déjà contenus dans les pointeurs vers les fonctions membres getf et setf.


Mais si j'essaie un modèle avec seulement

template <V(T::*getf)(), void (T::*setf)(VP)> 

ou

template <V(T::*getf)(), void (T::*setf)(VP), typename T, typename V, typename VP> 

alors les types ne peuvent pas être déterminés.


Ensuite, j'essayé spécialisation:

template <typename T, typename T2> 
struct Accessor; 

template <typename V, typename T, typename VP> 
struct Accessor <V(T::*)(), void (T::*)(VP)> 

qui déterminera tous les types si l'utilisation

typedef Accessor< 
    decltype(&TargetClass::GetFoo), 
    decltype(&TargetClass::SetFoo)> fooAcessor; 

Mais maintenant, je n'ai pas les pointeurs plus, seuls les types.


Est-il possible d'écrire un modèle afin que les types peuvent être déterminées automatiquement à partir du paramètre de modèle non de type?

Répondre

12

Existe-t-il un moyen d'écrire un modèle afin que les types puissent être déterminés automatiquement à partir du paramètre de modèle non-type?

En C++ 17, oui, grâce à declaring non-type template parameters with auto:

template <auto x> 
struct Test { 
    decltype(x) val{x}; 
}; 

Avant C++ 17, no. Vous devez écrire:

+2

@Muscampester Il est Barry, le magique C++ yorkshire! : D – Quentin

+2

@Quentin Ahem, [Westie] (https://fr.wikipedia.org/wiki/West_Highland_White_Terrier)! – Barry

+1

Oups. Busted cover est cassé, je ne sais rien à propos des chiens :(- Mais bon, il y a de la magie et il y a du C++, et c'est un chien, c'est comme si seulement 25% d'échec! – Quentin