我一直在想客户端/用户是否可以从类中确定要运行的功能。
例如,说我具有以下功能:
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()结果的向量,等等。
答案 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::bind
和std::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);
}