将类的方法作为参数传递给C ++中的另一个类

Fomalhaut

我的一般目的是设计一个优化器。这是一个为给定函数搜索最大值的类。我打算在代码的其他部分(包括其他类的方法)中使用此优化器。

我已经实现了这样的优化器:

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的解决方案。

Vee

C ++ 11解决方案(针对其编辑之前的问题):

问题在于,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()和传递此类对象而不是函数指针。

C ++ 03解决方案:

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将方法的返回值作为参数传递给同一类中的另一个方法

来自分类Dev

将getClass()作为参数传递给另一个类

来自分类Dev

从同一个类中的另一个方法访问作为方法传递给另一个类的方法

来自分类Dev

将参数作为另一个 Python 类中的类方法的装饰器

来自分类Dev

如何将模型的genericgenerator中的参数传递给另一个类(IdGenerator)

来自分类Dev

将一个类的对象传递给另一个类的方法

来自分类Dev

将类对象实例作为参数从 main() 传递给另一个类对象实例

来自分类Dev

将静态方法作为参数传递给Kotlin中的另一个方法

来自分类Dev

将所有类方法传递给Ruby on Rails中的另一个函数

来自分类Dev

将变量传递给另一个类中的方法

来自分类Dev

Python-将类方法作为参数的默认值传递给另一个类初始化

来自分类Dev

将内联构造的类作为类参数传递给方法

来自分类Dev

将内联构造的类作为类参数传递给方法

来自分类Dev

将一个方法作为参数传递给另一个方法

来自分类Dev

将一个方法作为参数传递给另一个方法

来自分类Dev

将数组传递给另一个类

来自分类Dev

将一个类中的数据传递给另一个类中的函数

来自分类Dev

这是将类的数组传递给另一个类中的方法的正确方法吗

来自分类Dev

如何将模板化类实例作为模板参数传递给另一个模板?

来自分类Dev

将枚举类作为参数传递给Java中的方法

来自分类Dev

将反射方法作为参数传递给另一个反射方法作为委托

来自分类Dev

C ++试图将类传递给另一个类的构造函数

来自分类Dev

C++ 将类的引用传递给另一个类

来自分类Dev

C ++:将类作为参数传递给其他类的方法

来自分类Dev

将类实例的输出作为输入传递给另一个

来自分类Dev

无法将变量从类中的函数传递给Swift中的另一个函数

来自分类Dev

将一个类传递给另一个类(Python)

来自分类Dev

使用构造函数将一个类传递给另一个类

来自分类Dev

PHP将一个类传递给另一个类构造函数

Related 相关文章

  1. 1

    将方法的返回值作为参数传递给同一类中的另一个方法

  2. 2

    将getClass()作为参数传递给另一个类

  3. 3

    从同一个类中的另一个方法访问作为方法传递给另一个类的方法

  4. 4

    将参数作为另一个 Python 类中的类方法的装饰器

  5. 5

    如何将模型的genericgenerator中的参数传递给另一个类(IdGenerator)

  6. 6

    将一个类的对象传递给另一个类的方法

  7. 7

    将类对象实例作为参数从 main() 传递给另一个类对象实例

  8. 8

    将静态方法作为参数传递给Kotlin中的另一个方法

  9. 9

    将所有类方法传递给Ruby on Rails中的另一个函数

  10. 10

    将变量传递给另一个类中的方法

  11. 11

    Python-将类方法作为参数的默认值传递给另一个类初始化

  12. 12

    将内联构造的类作为类参数传递给方法

  13. 13

    将内联构造的类作为类参数传递给方法

  14. 14

    将一个方法作为参数传递给另一个方法

  15. 15

    将一个方法作为参数传递给另一个方法

  16. 16

    将数组传递给另一个类

  17. 17

    将一个类中的数据传递给另一个类中的函数

  18. 18

    这是将类的数组传递给另一个类中的方法的正确方法吗

  19. 19

    如何将模板化类实例作为模板参数传递给另一个模板?

  20. 20

    将枚举类作为参数传递给Java中的方法

  21. 21

    将反射方法作为参数传递给另一个反射方法作为委托

  22. 22

    C ++试图将类传递给另一个类的构造函数

  23. 23

    C++ 将类的引用传递给另一个类

  24. 24

    C ++:将类作为参数传递给其他类的方法

  25. 25

    将类实例的输出作为输入传递给另一个

  26. 26

    无法将变量从类中的函数传递给Swift中的另一个函数

  27. 27

    将一个类传递给另一个类(Python)

  28. 28

    使用构造函数将一个类传递给另一个类

  29. 29

    PHP将一个类传递给另一个类构造函数

热门标签

归档