gpt4 book ai didi

c++ - "Automatically"为 C++ 成员函数创建非成员包装器

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:57:28 25 4
gpt4 key购买 nike

我有一个包含一堆成员函数的类,这些成员函数执行一些数学运算并返回结果。例如:

class Foo {
public:
double f(double);
double g(double);
double h(double);
// ...
}

double Foo::f(double foo1) {
// ...
}
// and so on

在我正在处理的程序中的几个点上,我需要对其中一些函数进行数值积分。我想使用的数值积分例程具有签名

extern "C" double qgauss(double (*func)(double, void*), void* data,
double a, double b);

根据我的阅读,将成员函数传递给集成例程的最佳方法似乎是创建包装函数:

double f_wrapper(double x, void* data) {
return ((Foo*)data)->f(x);
}

但是有大约十几个成员函数 f, g, h 等要包装,也许以后会添加更多,这变得非常重复。我可以(或者应该)使用模板或宏或其他东西来压缩我为创建这些包装函数而必须编写的代码量吗?


顺便说一句,我目前使用的解决方案是将集成例程重新实现为直接接受对象参数的 C++ 函数模板:

template <class C> double qgauss(C* obj, double (C::*func)(double),
double a, double b) {
// ...
}

但这涉及到大规模的代码重复,我不喜欢这样。如果有人有比创建包装函数或实现集成器的 C++ 版本更好的解决方案,我很想听听,我可以问一个单独的问题是否更合适。

最佳答案

你可以用模板试试:

template <class C, C::*Func>
double wrapper(double x, void* data) {
return ((C*)data)->*Func(x);
}

qgauss(&wrapper<C, &C::f>, data, a, b);

现在,我还没有试过这个,可能会有一些问题,因为你想要一个函数的地址,它是一个模板——更糟糕的是,我认为你在技术上需要一个 extern "C"功能。如果以上确实是一个死胡同,我认为你应该只使用宏,因为毕竟这是你正在做的 C 编程,而宏是很自然的。

关于c++ - "Automatically"为 C++ 成员函数创建非成员包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7761785/

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