我的一般目的是设计一个优化器。这是一个为给定函数搜索最大值的类。我打算在代码的其他部分(包括其他类的方法)中使用此优化器。
我已经实现了这样的优化器:
class MyOptimizer {
public:
typedef double (*FuncType)(double);
MyOptimizer(FuncType f, double a, double b) : _f(f), _a(a), _b(b) {}
double optimize() const {
// do something with _f in order to find the maximum
return maximum;
}
private:
double _a;
double _b;
FuncType _f;
}
我想在其他代码中将优化器用作库。例如:
class AnyClass {
public:
...
double func(double x) const {
// using members of the instance
}
void aMethod() {
MyOptimizer opt(func, 0.0, 1.0);
double bestArgument = opt.optimize();
}
...
};
但是我不允许这样做,因为的类型签名AnyClass::func
是不同的。
设计优化程序以使其便于在其他代码段中使用的最佳方法是什么?代码示例将不胜感激。
我需要C ++ 1998/2003 Standard的解决方案。
问题在于,AnyClass::func
实际上实际上需要两个参数,x
但也需要this
。如果您负担得起C ++ 11,std::function
请在这里(或提供Callable
模板)成为您的朋友:
MyOptimizer::MyOptimizer(std::function<double(double)> f, double a, double b);
然后,您可以将对象方法包装在lambda函数中:
MyOptimizer opt([this] (double x) -> double { return func(x); }, 0.0, 1.0);
如果不是,则需要编写自己的包装器类,该包装器类存储的值this
并公开operator()
和传递此类对象而不是函数指针。
template<class AnyClass>
class AnyClassWrapper {
AnyClass *that;
typedef double (AnyClass::*FuncType)(double);
FuncType func;
public:
AnyClassWrapper(AnyClass* _that, FuncType _func): that(_that), func(_func) { }
double operator()(double x) {
return that->*func(x);
}
};
此类的实例现在可以像函数一样使用:double y = instance(x)
。您还需要对构造函数进行模板化(在存储函数的情况下,请与之一起编辑整个类),以便能够接受普通的函数指针以及像这样的通用函数对象,使用两个语法都相同的事实:
template<class Func>
MyOptimizer::MyOptimizer(Func& f, double a, double b);
然后,您可以将其与非静态功能一起使用:
// within AnyClass
AnyClassWrapper<AnyClass> callable(this, &AnyClass::f);
MyOptimizer opt(callable, 0.0, 1.0);
但是同一类也接受正常的功能:
// anywhere
MyOptimizer opt2(std::sin, 0.0, 1.0);
注意,以上内容基本上是在实现lambda函数在幕后所做的事情。std::function
如果需要,您可以类似地向后移植-这将使优化器不需要任何模板。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句