c++ - 如何将函数指针的 std::vector 初始化为运算符重载?
问题描述
我正在尝试使用std::vector
指向四个运算符重载成员函数的指针。这有什么问题:
struct Fractal
{ int dividee;
int divisor;
Fractal operator +(Fractal other)
{ [not important]
}
Fractal operator -(Fractal other)
{ [not important]
}
Fractal operator *(Fractal other)
{ [not important]
}
Fractal operator /(Fractal other)
{ [not important]
}
};
int main()
{ Fractal fractal = Fractal{3, 10};
typedef Fractal(*fractalOperator)(Fractal, Fractal);
std::vector<fractalOperator> ops =
{ &Fractal::operator +,
&Fractal::operator -,
&Fractal::operator *,
&Fractal::operator /
};
}
编译器说
error: could not convert '{&Fractal::operator+, &Fractal::operator-, &Fractal::operator*, &Fractal::operator/}' from '<brace-enclosed initializer list>' to 'std::vector<Fractal (*)(Fractal, Fractal)>'
};
这不是很有帮助。正确的方法是什么?我正在使用 c++14。
解决方案
一种方法是:
std::vector<std::function<Fractal(Fractal, Fractal)>> ops = {
[](Fractal l, Fractal r){ return l + r; },
[](Fractal l, Fractal r){ return l - r; },
[](Fractal l, Fractal r){ return l * r; },
[](Fractal l, Fractal r){ return l / r; },
};
这样做的好处是,无论运算符是作为成员函数还是自由函数实现都无关紧要。
在幕后,lambda 存储在function
具有正确调用签名的对象中,而那些存储在vector
.
推荐阅读
- prometheus - Grafana 无法从 python prometheus 获取指标(“未找到指标”)
- backwards-compatibility - 兑换版本和功能向后兼容
- javascript - 将 request.get 中的值分配给 const 以供进一步使用。节点 Js
- javascript - 如何获取pdf文件的页数
- raspbian - 如何使用 xinetd 通过 TCP 将管道传输到另一个程序的标准输入
- google-docs-api - 使用 user.birthday.read 范围获取生日信息
- python - 我编写了一个程序,用字母顺序替换输入字符串中的所有字符,但我不明白为什么它没有按预期工作
- android - 强制数据绑定以获取所有中间媒体 livedata / mediatorlivedata 更改
- javascript - 是的,'notRequired' 方法似乎在我的表单验证中不起作用
- amazon-web-services - 在 Amazon S3 中设置每个客户端的存储桶的最简单方法