"Automatically"为C++成员函数创建非成员包装器
"Automatically" creating non-member wrappers for C++ member functions
我有一个类,它有一堆成员函数,这些函数做一些数学运算并返回结果。例如:
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
等要包装,并且可能稍后还要添加更多,这变得相当重复。我可以(或者也许应该)使用模板或宏或其他东西来压缩为了创建这些包装器函数而必须编写的代码量吗?
作为题外话,我目前使用的解决方案是将集成例程重新实现为直接接受object参数的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++ 类包装到 python 中,以便我可以使用 pybind11 访问其成员的公共方法(成员是一个对象指针)
- 使用 Swig 在成员中包装具有互斥锁的 C++ 类时出现问题
- c++\CLI dll包装器,用于调用c++类中的虚拟成员
- 在析构函数之后,围绕成员函数的C++lambda包装器是如何工作的
- 其他成员函数的通用"成员函数"包装器?
- 如何在 SWIG 中包装可变参数模板类的可变参数模板成员函数?
- std::带有指向成员函数和back_inserter的指针的转换包装器
- C 函数调用包装器包含类成员功能作为模板参数
- 使常规函数使用模板包装成员函数
- 将元组成员包装在其他模板化类型中
- CPP成员对C回调包装器的反馈
- OpenGL C++:VBO 的结构包装器不会初始化成员
- 使用可变参数模板(gcc、clang)的成员函数指针包装器
- 如何为其他类成员函数编写模板包装方法
- 模板化类包装成员函数调用的行为
- 如何使用模板函数参数编写包装函数,该功能可以采用超载的成员函数
- 使用struct作为成员功能的包装器
- 如何编写 C++ 类成员函数包装器
- 是否有一种方法可以让公共成员在班级外部无法解码,而无需访问包装器功能
- 推导成员函数包装器的返回类型时出错