Maison  >  Article  >  développement back-end  >  ## Pouvez-vous obtenir des pointeurs de fonction vers les opérateurs intégrés C ?

## Pouvez-vous obtenir des pointeurs de fonction vers les opérateurs intégrés C ?

Patricia Arquette
Patricia Arquetteoriginal
2024-10-25 11:52:30116parcourir

## Can You Get Function Pointers to C   Built-in Operators?

Est-il possible d'obtenir le pointeur de fonction d'un opérateur standard intégré ?

Le défi

Utiliser des pointeurs de fonction pour référencer des dans les opérateurs comme l'opérateur "supérieur à" (">") dans une classe de modèle, il est nécessaire de spécifier les surcharges de type correctes. Cependant, cela peut être difficile.

Pourquoi les opérateurs intégrés ne peuvent pas être des pointeurs de fonction

Les opérateurs intégrés en C, tels que les opérateurs arithmétiques et logiques, ne sont pas de véritables fonctions d'opérateur. Au lieu de cela, ils sont directement traduits en instructions d’assemblage par le compilateur. Par conséquent, il n'est pas possible d'obtenir des pointeurs de fonction pour eux.

Les objets de fonction comme alternative

Les objets de fonction, définis dans la norme C, fournissent un moyen de travailler avec des opérations qui se comportent comme des pointeurs de fonction. mais ne sont pas des fonctions réelles. Ce sont des objets modélisés qui se désintègrent en l'opérateur analogue dans leur fonction Operator().

Par exemple, l'objet de fonction std::greater représente l'opérateur supérieur à (">"). Il peut être utilisé comme argument de pointeur de fonction dans une classe de modèle.

<code class="cpp">template<typename ParamsType, typename FnCompareType>
class MyAction
{
public:
    MyAction(ParamsType& arg0, ParamsType& arg1, FnCompareType& fnCpmpare) 
    : arg0_(arg0), arg1_(arg1), fnCompare_(fnCompare_) {}

    bool operator()()
    {
        if((fnCompare_)(arg0_,arg1_))
        {
            // Do this
        }
        else
        {
            // Do s.th. else
        }
    }

private:
    ParamsType& arg0_;
    ParamsType& arg1_;
    FnCompareType& fnCompare_;
}</code>
<code class="cpp">void doConditional(int param1, int param2)
{
    MyAction<int, std::greater<int>> action(param1, param2);
    if(action())
    {
        // Do this
    }
    else
    {
        // Do that
    }
}</code>

Opérateurs de type de classe standard

Bien que les pointeurs de fonction ne puissent pas être utilisés directement avec les opérateurs intégrés, ils peut être utilisé avec des opérateurs de bibliothèque standard implémentés en tant que fonctions réelles. Cependant, il est nécessaire d'instancier l'instance spécifique de la classe modèle pour l'opérateur, et le compilateur peut avoir besoin d'indices pour déduire correctement l'argument du modèle.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn