Pergunta

Isso parece inconsistente. Por que usamos & Exemplo :: func em vez de Exemplo :: func? há um uso para Exemplo :: func ou & exampleFunction? ele não parece que nós podemos fazer uma referência a uma função para que exclui Exemplo :: func. e eu não posso pensar em uma maneira de usar & exampleFunction desde exampleFunction já retorna um ponteiro.

#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;
} 
Foi útil?

Solução

Porque é assim que a norma define ponteiros para funções.

Você realmente sempre tem que usar o & operador de endereço para obter um ponteiro para uma função, mas para as funções regulares e função de membro estático, uma conversão implícita de função para ponteiro-para-função é definido na norma.

Este não é definido para um (não estático) memberFunction porque você não pode obter um lvalue a um memberFunction não estático.

A partir do C ++ padrão:

4,3 conversão de função-para-ponteiro

  1. Um lvalue do tipo de função T pode ser convertido em um rvalue do tipo “Ponteiro para T”. O resultado é um ponteiro para a função.

com nota 52:

Esta conversão não se aplica a funções membro não-estática, pois um Ivalue que se refere a uma função de membro não-estático não pode ser obtido.

Eu acho que eles preferem só permitem & função, por razões de coerência, mas que a conversão implícita é simplesmente um artefato do património C ...

Outras dicas

O ponto está usando ponteiros de função . Para um exemplo muito áspero, suponha que você tenha uma classe ter várias variáveis ??de membro pelo qual você pode precisar para classificar os elementos de uma matriz desse tipo de classe, como este:

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);

Aqui std :: sort é usado para classificar um conjunto de CL objetos. Olhe para o terceiro parâmetro, que é o nome de uma função. A função std :: tipo pode levar um ponteiro de função no terceiro parâmetro, e utilizar essa função como comparador para classificar a matriz. É até nós como definir sort_by_ funções * para que std :: sort funciona como esperado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top