C++ c++;具有每个实例化对象的特定功能的结构(或类)

C++ c++;具有每个实例化对象的特定功能的结构(或类),c++,callback,function-pointers,C++,Callback,Function Pointers,我需要实现一个结构(或类),其中每个实例都有一个指向特定函数的“指针”。这可能吗 大概是这样的: struct constrain{ string name; int direction; double evaluate (vector <double> &x_var); }; struct constrain{ string

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

大概是这样的:

struct constrain{

  string                              name;
  int                            direction;
  double evaluate (vector <double> &x_var);
};
struct constrain{
  string                              name;
  int                            direction;
  double  (*evaluate) (vector <double> &x_var);
};
struct约束{
字符串名;
int方向;
双重评估(向量&x_-var);
};

其中evaluate“指向”一个特定函数,这样当我创建约束对象时,我就可以知道对象方法evaluate应该指向哪个函数,并且当我以后使用它时(例如,我的约束对象将包含在std::vector中),我就可以调用特定函数。

是的,这是可能的。您需要稍微更改您的定义:

struct constrain{

  string                              name;
  int                            direction;
  double  (*evaluate)(vector <double> x_var);
};
struct约束{
字符串名;
int方向;
双(*评估)(向量x_var);
};

然而,这是一个有点C-ish的方法。由于您使用C++,所以可以使用函数对象(重载<代码>操作程序)(< /代码>)。< /p> < p>创建函数中的一个参数为指针:
constraint::constraint (double (*pFn)(vector <double> x_var))
{
    this->evaluate = pFn
}
constraint::constraint(双(*pFn)(向量x_var))
{
此->评估=pFn
}
同样在标题中正确:

double  (*evaluate) (vector <double> x_var);
double(*评估)(向量x_var);

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

试着这样做:

struct constrain{

  string                              name;
  int                            direction;
  double evaluate (vector <double> &x_var);
};
struct constrain{
  string                              name;
  int                            direction;
  double  (*evaluate) (vector <double> &x_var);
};
struct约束{
字符串名;
int方向;
双(*评估)(向量和x_变量);
};

struct约束{
字符串名;
int方向;
功能评估;
};
请注意,这不会有任何指向调用它的“对象”的指针,因此您必须添加适当的参数(为了方便起见,可能需要键入def):

struct约束{
typedef double(*callback_t)(约束*对象、向量和x_变量);
字符串名;
int方向;
回拨评估;
//辅助函数
双重评估(向量和x_变量){
返回evaluate_f(this,x_var);
}
};
检查使用情况


如果使用
boost::function
boost::bind
(或
std:*
等价物,如果使用C++11编译器):

考虑使用
std::function

struct Foo
{
    std::function<double (std::vector<double>)> func;
};
如果您的代码> STL< /Cult>实现没有<代码> STD::函数< /> >考虑使用<代码> Boo::函数< />代码>

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

范例

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

类似地,您可以使用结构成员指针作为函数

的指针,它是否需要访问<代码>这个< /代码>指针?使用引用来传递<代码> xyava>代码>,并且考虑通过向量传递值可能不是正确的事情。@ PMR:你是对的,但问题是向量是如何传递的,你假设他的编译器(或STL实现)已经有了这些。这完全是针对OP的。我相信这将成为公认的答案。您可能需要添加一段关于运行时/编译时之间差异的内容,并将其扩展为使用模板和函子。我的第一个问题是stackoverflow。。印象深刻!谢谢,我将尝试以下实现:-)(我在MinGW上使用g++4.6和4.4)
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;
}