2017-07-22 8 views
1

J'ai fait la méthode suivante comme une petite expérience pour savoir si cela serait possible:Autoriser la déduction des arguments de modèle de type de membre pointée par le pointeur à l'argument membre de la méthode

template<typename dataT> 
class DemographicNode 
{ 
    //... 
    template<typename varT> 
    varT count(const varT dataT::* variable = &dataT::citizens) const { 
     //... 
    } 
    //... 
} 

Cela fonctionne comme attendu sauf pour le fait que cela ne permet pas la déduction d'argument de modèle de varT même si un appel à cette méthode fournirait toutes les informations disponibles à la compilation requises.

Est-il possible d'activer la déduction d'argument de modèle dans ce cas? J'utilise VC++ 17.

Edit: Je dois l'appeler de la manière suivante:

gameState.getCountries()[0]->getDemoGraphics().count<double>(); 

et je veux l'appeler avec quelque chose comme ceci:

gameState.getCountries()[0]->getDemoGraphics().count(); 
+2

Comment appelez-vous cela? – songyuanyao

+0

Pourriez-vous montrer la partie appelante? Je ne peux pas reproduire le problème. – Holt

+3

La déduction de l'argument de modèle ne fonctionne pas avec les arguments par défaut. – songyuanyao

Répondre

2

Comme mentionné dans les commentaires, La déduction d'argument de modèle ne fonctionne pas avec les arguments par défaut.

Ici, vous pouvez simplement définir un paramètre de modèle par défaut pour varT:

template<typename varT = decltype(dataT::citizens)> 
varT count(const varT dataT::* variable = &dataT::citizens) const { 

}; 

Ou vous pouvez ajouter une surcharge sans paramètres pour count():

template<typename dataT> 
class DemographicNode { 
public: 
    // no more default argument here 
    template<typename varT> 
    varT count(const varT dataT::* variable) const { 
    }; 

    // overload without parameters 
    auto count() const { 
     return count(&dataT::citizens); 
    } 
};