Pregunta

Obtuve algunos objetos que las variables dependen de diferentes funciones. Para ponerlo en diferentes palabras: hay múltiples tipos de funciones en las que dependen las variables en el objeto, pero deben haber múltiples objetos con las mismas de estas funciones. Para más autorización intenté dar un ejemplo (que no funciona).

#include <iostream>

class A
{
  double size;

  A( double (*f)() )
  {
    size = (*f)();
  };
};

double fun1()
{
  return 42.0;
}


int main()
{
  A a = A( &fun1() );

  std::cout << a.size << std::endl;
}

Por supuesto, este es un ejemplo mínimo. El tamaño de la variable depende de una determinada función que debe pasar como argumento a la clase. Imaginar fun1 y fun2 como diferentes tipos de generadores de números aleatorios.

Creo que la forma ideomática en C ++ sería una clase que contiene la variable y las clases heredadas de ella están modificadas por esa función que difiere de los objetos (corrígeme si estoy equivocado con esta suposición). Pero mi pregunta es:

¿Hay alguna posibilidad de implementar algún tipo de constructor de orden superior? Si es así, un ejemplo sería bueno.

PD: Si usara algunos términos técnicos mal, me alegraría ser corregido.

¿Fue útil?

Solución

Cambiar a:

A( double (*f)() )
{
    size = f();
};

Y:

A a = A( fun1 );

Cuando estabas pasando &fun1() Eso estaba tratando de llamar a la función y luego tomar la dirección de su resultado. Lo que realmente querías era el puntero de la función que se almacena en fun1.

Otros consejos

Este ejemplo no tiene sentido, porque no guarda el puntero de la función para su uso posterior. Puedes reescribir esto simplemente a solo

class A
{
    double size;

    A(double sz) {
        size = sz;
    };
};

double fun1()
{
    return 42.0;
}


int main()
{
    A a = A(fun1());
    std::cout << a.size << std::endl;
}

Sugiero escribir una plantilla en su lugar para que pueda pasar en cualquier puntero de función o objeto de función. Esto permite que el compilador haga optimizaciones más fácilmente como la inscripción en muchos casos, y es más flexible. Tampoco debe usar paréntesis al adquirir un puntero de funciones.

#include <iostream>

class A {
public:
    template<typename F>
    explicit A(F&& f) : size(f()) {

    };

    double size;
};

double fun1() {
    return 42.0;
}

int main() {
    A a(&fun1);
    std::cout << a.size << std::endl;
}

Parece que solo necesita pasar la función en sí. Casi lo tienes. Aquí está la sintaxis correcta:

typedef double (*functype)();

void foo(functype f) {
    cout << f();
}

double bar() {
    return 2.39;
)

foo(bar); // don't call bar here, just pass it as address.

También puedes declarar Foo de la siguiente manera:

void foo(double (*f)());

Las funciones no son objetos de primera clase en C ++, por lo que la única forma de crear un cierre con algunas variables (por ejemplo, si desea llevar la función o llamar a una función de miembro no estática) es los functores (objetos con operador sobrecargado () ). Hay varias formas de obtener tal objeto:

  1. Defínelo usted mismo, almacene todas las variables necesarias en los campos y paselo como argumento de la función.
  2. Use funciones lambda de C ++ 11 y función std ::
  3. Use Boost :: Function and Boost :: Bind.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top