1

我需要实现一个结构(或类),其中每个实例都有一个指向特定函数的“指针”。这可能吗?

像这样的东西:

struct constrain{

  string                              name;
  int                            direction;
  double evaluate (vector <double> &x_var);
};

其中评估“指向”特定函数,因此当我创建约束对象时,我可以告诉对象方法评估应该指向哪个函数以及何时使用它(例如,我的约束对象将包含在 std::矢量)我可以调用特定的函数。

4

5 回答 5

2

考虑使用std::function

struct Foo
{
    std::function<double (std::vector<double>)> func;
};

最好vector按照pmr的建议通过引用。这是完整的示例:

#include <iostream>
#include <vector>
#include <functional>

struct Foo
{
    std::function<double (const std::vector<double> &)> func;
};

static double calc(const std::vector<double> &params)
{
    return 10.0;
}

int main()
{
    Foo f;
    f.func = calc;

    std::vector<double> v;
    std::cout << f.func(v) << std::endl;

    return 0;
}

如果您的STL实现没有std::function考虑使用boost::function

于 2012-08-09T08:28:53.587 回答
0

是的,这是可能的。你需要稍微改变你的定义:

struct constrain{

  string                              name;
  int                            direction;
  double  (*evaluate)(vector <double> x_var);
};

但是,这有点 C-ish 方法。由于您使用的是 c++,因此您可以使用函数对象(带有重载的对象operator())。

于 2012-08-09T08:26:01.680 回答
0

创建构造函数,其中参数之一是函数指针:

constraint::constraint (double (*pFn)(vector <double> x_var))
{
    this->evaluate = pFn
}

在标题中也正确:

double  (*evaluate) (vector <double> x_var);
于 2012-08-09T08:26:28.470 回答
0

可以使用指向函数或仿函数的指针(例如来自 boost)。

尝试这样的事情:

struct constrain{
  string                              name;
  int                            direction;
  double  (*evaluate) (vector <double> &x_var);
};

或者

struct constrain{
  string                              name;
  int                            direction;
  boost::function<double(vector &<double>)> evaluate;
};

请注意,这不会有任何指向调用它的“对象”的指针,因此您必须添加适当的参数(为了方便起见,可能还需要 typedef ):

struct constrain{
  typedef double  (*callback_t) (constrain *obj, vector <double> &x_var);
  string                              name;
  int                            direction;
  callback_t evaluate_f;

  // helper function
  double evaluate(vector <double> &x_var) {
    return evaluate_f(this, x_var);
  }
};

检查http://ideone.com/VlAvD的使用情况。

boost::function如果使用and boost::bindstd::*如果您使用带有 C++11 的编译器,则使用等价物)可能会简单得多:http: //ideone.com/wF8Bz

于 2012-08-09T08:28:19.410 回答
0

是的,我们确实有指向函数的指针一旦你创建了这样一个指针,你就可以用函数的地址来实例化它

例子

void my_int_func(int x)
{
    printf( "%d\n", x );
}

int main()
{
    void (*foo)(int); // this is a pointer to a function
    foo = &my_int_func;

    return 0;
}

同样,您可以将结构成员指针用作指向函数的指针

于 2012-08-09T08:29:13.683 回答