Domanda

Questo sembra incoerente. Perché usiamo & amp; Esempio :: func invece di Esempio :: func? c'è un uso per Esempio :: func o & amp; exampleFunction? non sembra che possiamo fare un riferimento a una funzione in modo da escludere Esempio :: func. e non riesco a pensare a un modo per usare & amp; exampleFunction poiché exampleFunction restituisce già un puntatore.

#include <iostream>
class Example {
public:
    void func() { std::cout <<"print me\n"; }
};
void exampleFunction() { std::cout << "print me too\n"; }
typedef void (Example::*ExampleFunc_t)(); 
typedef void (*ExampleFunction_t)();
int main()
{
    Example e;
    ExampleFunc_t     f  = &Example::func;
    ExampleFunction_t f2 = exampleFunction;
    (e.*f)();
    f2();
    return 0;
} 
È stato utile?

Soluzione

Perché è così che lo standard definisce i puntatori alle funzioni.

In realtà devi sempre utilizzare l'operatore di indirizzo & amp; per ottenere un puntatore a una funzione, ma per le funzioni regolari e le funzioni statiche dei membri, una conversione implicita da funzione a puntatore a funzione è definito nello standard.

Questo non è definito per una funzione membro (non statica) perché non è possibile ottenere un valore per una funzione membro non statica.

Dallo standard C ++:

  

4.3 Conversione da funzione a puntatore

     
      
  1. Un valore di tipo T può essere convertito in un valore di tipo   & # 8220; puntatore a T. & # 8221; Il risultato è un puntatore alla funzione.
  2.   

con nota 52:

  

Questa conversione non si applica mai alle funzioni membro non statiche perché   non è possibile ottenere un valore che fa riferimento a una funzione membro non statica.

Penso che preferirebbero solo consentire & amp; funzione, per motivi di coerenza, ma che la conversione implicita è semplicemente un artefatto del patrimonio C ...

Altri suggerimenti

Il punto sta usando Puntatori di funzioni . Per un esempio molto approssimativo, supponiamo di avere una classe con più variabili membro in base alle quali potrebbe essere necessario ordinare gli elementi di un array di quel tipo di classe, come questo:

struct CL {
    int x, y, z;
};

bool sort_by_x(const CL& obj1, const CL& obj2);
bool sort_by_y(const CL& obj1, const CL& obj2);
bool sort_by_z(const CL& obj1, const CL& obj2);

...

CL obj[100];
...
sort(obj, obj+100, sort_by_x);
...
sort(obj, obj+100, sort_by_y);
...
sort(obj, obj+100, sort_by_z);

Qui std :: sort è usato per ordinare una matrice di oggetti CL. Guarda il terzo parametro, è il nome di una funzione. La funzione std :: sort può prendere un puntatore a funzione nel terzo parametro e usare quella funzione come comparatore per ordinare l'array. Spetta a noi come definire le funzioni sort_by_ * in modo che std :: sort funzioni come previsto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top