C 11 définit les opérateurs intégrés dans [over.built] et précise que ces opérateurs participent à la résolution des surcharges mais ne servent à aucun autre but. En tant que tel, vous ne pouvez pas avoir de pointeurs de fonction qui pointent vers eux.
Pour résoudre ce problème, la norme introduit les objets de fonction dans [function.objects]. Ces objets peuvent se désintégrer en leurs opérateurs correspondants dans leur fonction Operator() :
Les objets de fonction peuvent être utilisés comme arguments de pointeur de fonction, comme démontré dans la réponse fournie par l'utilisateur1034749.
Pour les opérateurs de bibliothèque standard, vous pouvez les utiliser comme pointeurs de fonction, bien que vous deviez vous référer à leurs instances de modèle respectives. Le compilateur a besoin de suffisamment d'indices pour déduire le bon modèle. Voici un exemple :
<code class="cpp">#include <iostream> #include <string> using namespace std; template<class Test> Test test_function(Test const &a, Test const &b, Test (*FPtr)(Test const &, Test const &)) { return FPtr(a, b); } int main() { typedef basic_string<char> String; String a("test"), b("test2"); cout << test_function(a, b, &operator+); return 0; }</code>
Dans cet exemple, l'opérateur est fourni comme pointeur de fonction pour la fonction test_function. Notez que si vous omettez l'argument de modèle pour test_function, la déduction échouera dans certains compilateurs comme MSVC 2012.
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!