"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment sélectionner une fonction membre en fonction d'un paramètre de modèle à l'aide de « enable_if » ?

Comment sélectionner une fonction membre en fonction d'un paramètre de modèle à l'aide de « enable_if » ?

Publié le 2024-11-06
Parcourir:975

How to Select a Member Function Based on a Template Parameter Using `enable_if`?

Sélection d'une fonction membre à l'aide des conditions Enable_If

La tâche consiste à déterminer l'invocation d'une fonction membre en fonction d'un paramètre de modèle de classe. L'extrait de code suivant tente d'y parvenir :

#include 
#include 

template
struct Point
{
  void MyFunction(typename std::enable_if<:is_same int>::value, T &>::type* = 0)
  {
    std::cout ::value, float &>::type* = 0)
  {
    std::cout 

Cependant, ce code ne parvient pas à se compiler avec l'erreur "aucun type nommé 'type' dans 'struct std::enable_if'".

SFINAE en action

La clé pour comprendre ce problème réside dans le concept de l'échec de la substitution n'est pas une erreur (SFINAE). Enable_if permet une compilation conditionnelle basée sur des arguments de modèle. Dans ce cas, l'argument du modèle T est déjà connu lorsque les fonctions membres sont instanciées. Par conséquent, la condition est évaluée au moment de l'instanciation et la fonction correspondante est sélectionnée.

Fixation du code

Pour rectifier cela, nous devons introduire un argument de modèle factice qui est par défaut T. Cela permet au mécanisme SFINAE de fonctionner comme prévu. Le code modifié ressemblerait à ceci :

template
struct Point
{
  template
  typename std::enable_if<:is_same int>::value>::type
    MyFunction()
  {
    std::cout 
  typename std::enable_if<:is_same float>::value>::type
    MyFunction()
  {
    std::cout 

Prévenir la spécialisation explicite des fonctions membres

Comme l'a souligné HostileFork, le code d'origine permet la spécification explicite d'arguments de modèle pour les fonctions membres, ce qui pourrait conduire à des résultats incorrects. Pour éviter cela, nous pouvons ajouter un static_assert qui vérifie si des arguments de modèle sont fournis. Cela garantit que la fonction membre correcte est toujours invoquée en fonction de l'argument de modèle T. Le code modifié serait :

template
struct Point
{
  template
  typename std::enable_if<:is_same int>::value>::type
    MyFunction()
  {
    static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
    std::cout 
  typename std::enable_if<:is_same float>::value>::type
    MyFunction()
  {
    static_assert(sizeof...(Dummy)==0, "Do not specify template arguments!");
    std::cout 
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3