用C ++编写一个函数,客户端在该函数中决定从类中运行什么函数?

时间:2019-07-13 12:45:20

标签: c++

我一直在想客户端/用户是否可以从类中确定要运行的功能。

例如,说我具有以下功能:

std::vector<double> greeks_mesh_pricer(const Greeks& Greek, (function to Run), int mesh_size) {
    std::vector<double> result;
    for(int i = 0; i < mesh_size; i += mesh_size) {
        result.push_back(Greek.(function to run));
    }
}

要运行的函数,是希腊类的成员函数。希腊语是一个包含纯虚函数的接口,因此用户实际上是在传递 在派生的希腊人中。因此,如果客户端指定函数Delta(),它将返回Delta()结果的向量,等等。

4 个答案:

答案 0 :(得分:3)

您可以使用指向成员函数的指针来做到这一点:

#include <iostream>

struct Base {
    virtual ~Base() {}
    virtual void foo() const = 0;
    virtual void bar() const = 0;
};

struct Derived1 : Base {
    void foo() const { std::cout << "Derived1::foo\n"; }
    void bar() const { std::cout << "Derived1::bar\n"; }
};

struct Derived2 : Base {
    void foo() const { std::cout << "Derived2::foo\n"; }
    void bar() const { std::cout << "Derived2::bar\n"; }
};

void invoke(const Base &b, void (Base::*func)() const) {
    (b.*func)();
}

int main() {
    Derived1 d1;
    Derived2 d2;

    invoke(d1, &Base::foo);
    invoke(d2, &Base::foo);
    invoke(d1, &Base::bar);
    invoke(d2, &Base::bar);
}

输出

Derived1::foo
Derived2::foo
Derived1::bar
Derived2::bar

答案 1 :(得分:0)

Windows使用IDispatch实现了这种自动化,如果不使用Windows,则可以实现类似的自动化。这个想法是通过ID(或从名称翻译过来)指定一个函数,并将参数作为VARIANT传递。

答案 2 :(得分:0)

您可能正在询问C ++中的函数指针。就像指针可以用来引用变量或对象一样,指针也可以用来引用函数,您也可以使用这些指针将函数传递给函数或创建一个指针数组,其中每个指针实际上都是一个指针。函数指针(对函数的引用)。

在这里阅读:https://www.cprogramming.com/tutorial/function-pointers.html

答案 3 :(得分:0)

您可以使用std::function来表示和存储函数。您还可以使用std::bindstd::placeholder来简化整个过程。示例:

struct A {
  int f(int);
  int g(int);
};

A instance;
std::function<int(int)> client_fn;
using namespace std::placeholders;
if (...) {
    client_fn = std::bind(&A::f, &instance, _1);
} else {
    client_fn = std::bind(&A::g, &instance, _1);
}