gpt4 book ai didi

c++ - 成员函数指针c++

转载 作者:行者123 更新时间:2023-11-30 01:47:02 24 4
gpt4 key购买 nike

我查看了访问者模式和成员函数指针的最佳答案;但我仍然无法理解应该如何设计以下(相当简单的)场景。

在一个基本示例中,我想要一个优化器类。给定另一个类的成员函数,它会找到一些最优值。像这样:

class Optimizer{
public:
typedef double (*Func1d)(double);
typedef double (*Func2d)(double,double);
void Optimize1d(Func1d* f1Ptr, double& x);
void Optimize2d(Func2d* f2Ptr, double& x, double& y);
};

和两个示例类:

class A {
double A1d(double x){return x;}
};

class B{
double B2d(double x, double y){return x+y;}
};

和主要功能,我希望能够按如下方式使用:

void main()
{
Optimizer opt;
double xA_opt, xB_opt, yB_opt;
opt.Optimize1d(&A::A1d,xA_opt);
opt.Optimize2d(&B::B2d, xB_opt, yB_opt);
}

但是,我仍然无法让它工作。我不希望优化器直接持有指向 A 和 B 类型对象的指针;因为那时他需要熟悉这些对象。

我希望这个问题是有道理的。谢谢!

最佳答案

问题是 typedef double (*Func1d)(double); 不是成员函数指针,而只是一个普通的函数指针。

如果您使用真正的成员函数指针,该函数还必须有一个您说不需要的 AB 的实例。

如果您不能使 A1dB2d 静态化,则其他选项是使您的 Optimize1dOptimize2d 采用模板仿函数的模板函数:

template<typename F>
void Optimize1d(F f1, double& x);
template<typename F>
void Optimize2d(F f2, double& x, double& y);

std::function:

void Optimize1d(std::function<double(double)> f1, double& x);
void Optimize2d(std::function<double(double, double)> f2, double& x, double& y);

两者都可以通过 lambda 捕获 AB 的实例来调用:

A a;
B b;
opt.Optimize1d([&a](double x){return a.A1d(x); }, xA_opt);
opt.Optimize2d([&b](double x, double y){return b.B2d(x, y); }, xB_opt, yB_opt);

编辑:如果您没有 C++11,则可以使用定义 operator() 而不是 lambda 的类来定义自己的仿函数。该类必须在成员变量中存储指向 AB 实例的指针或引用:

struct A1d {
A* a;
A1d(A& a) : a(&a) {}
double operator()(double x) { return a->A1d(x); }
};

然后您可以构造此类的实例并将其传递给模板化优化函数:

A1d a1d(a);  
opt.Optimize1d(a1d,xA_opt);

Live demo.

也许您甚至可以通过向它们添加 operator() 函数来使您的 AB 类仿函数本身?

关于c++ - 成员函数指针c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32205719/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com