如何将std::complex运算符存储为C++中的变量?
你遇到的问题根源是std::complex的成员运算符(比如operator+=)本质是成员函数,它的签名包含隐含的this指针,和你定义的std::function类型不匹配。下面给两种可行的解决方法,推荐用第一种,更适合测试场景:
1. 用Lambda包装(推荐)
Lambda可以轻松适配任何运算符的调用逻辑,不管是成员还是非成员运算符,都能统一成你需要的std::function接口,非常适合编写通用测试用例:
- 针对复合赋值运算符(operator+=、operator-=这类修改左操作数的):
#include <functional> #include <complex> int main() { // 包装 operator+= std::function<void(std::complex<double>&, const std::complex<double>&)> plus_eq = [](std::complex<double>& lhs, const std::complex<double>& rhs) { lhs += rhs; }; // 测试调用 std::complex<double> a(1.0, 2.0), b(3.0, 4.0); plus_eq(a, b); // 效果等价于 a += b }
- 针对二元运算符(operator+、operator-这类返回新对象的):
// 包装 operator+ std::function<std::complex<double>(const std::complex<double>&, const std::complex<double>&)> add_op = [](const std::complex<double>& lhs, const std::complex<double>& rhs) { return lhs + rhs; }; // 测试调用 auto result = add_op(a, b); // 效果等价于 a + b
2. 直接适配成员函数指针类型
如果一定要直接绑定成员函数指针,需要调整std::function的签名,把成员函数隐含的this指针显式作为第一个参数(指针类型):
// 适配 operator+= 的成员函数指针 std::function<void(std::complex<double>*, const std::complex<double>&)> plus_eq_ptr = &std::complex<double>::operator+=; // 调用时需要传入左操作数的指针 plus_eq_ptr(&a, b); // 等价于 a += b
这种方式虽然能直接绑定成员函数,但接口不够直观,而且需要区分成员和非成员运算符的签名,不如Lambda通用。
内容的提问来源于stack exchange,提问作者CuriousSoul
相关产品推荐
相关产品推荐

