2017-10-19 1 views
3

Voici le pointeur sur une méthode de classe qui accepte deux ints et retourne un entier:modèle pour typedef qui accepte pointeur vers les const et les fonctions non-const

template <typename T> 
using TFunction = int (T::*)(int, int); 

Je ne peux passer ici des méthodes non-const . Comment changer ce modèle de manière à accepter les méthodes const et non-const?

+0

Vous voulez dire * fonctions * const' et non-'const', n'est-ce pas? Aucun type de pointeur unique ne peut faire les deux en même temps. – Quentin

+0

Je n'accepte aucun membre *. Il accepte un 'T'. Vous êtes allé trop minime sur votre [mcve]. Ceci est une question XY. – StoryTeller

+0

Vous ne pouvez pas avoir un nom qui se réfère à 2 types en même temps. Vous pouvez faire 'template en utilisant TCFunction = int (T :: * const) (int, int);' pour avoir un nom pour les fonctions 'const' ou vous tapez-effacer les pointeurs de fonction avec' std :: function' ou votre propre version. – nwp

Répondre

6

Cette affaire est assez simple pour une condition:

template <typename T> 
using TFunction = std::conditional_t< 
    std::is_const_v<T>, 
    int (T::*)(int, int) const, 
    int (T::*)(int, int) 
>; 

Maintenant TFunction<Foo> est int (Foo::*)(int, int) et TFunction<Foo const> est int (Foo::*)(int, int) const.

+1

Mais qu'en est-il des types Foo non const avec des fonctions membres constantes? – Jodocus

+1

@Jodocus c'est un refrain rouge: Je suis en train de greffer le paramètre "const'-or-non-' const "sur" T "au lieu de faire, disons, un' bool' séparé. Cela n'a rien à voir avec le 'const'ness du vrai' Foo' que vous utiliserez plus tard, vous serez toujours capable d'appeler un 'TFunction ' sur un 'Foo' :) – Quentin

+2

J'ai supprimé mon commentaire original parce que ceci est brillant. Même si en général 'T' doit être une expression id (et en tant que telle ne peut pas être' const T' en général), le contexte du template permet à la fois d'utiliser les informations de type, * et * de garder le pointeur formé. – StoryTeller