我需要将一个函数传递给操作员。任何具有正确 arg 类型的一元函数。返回类型可以是任何东西。因为这是库代码,所以我不能将其包装或强制f
转换为特定的重载(在 之外operator*
)。函数将operator*
第一个参数作为它自己的参数。下面的人工示例编译并返回正确的结果。但是它有硬编码int
的返回类型——使这个例子可以编译。
#include <tuple>
#include <iostream>
using namespace std;
template<typename T>
int operator* (T x, int& (*f)(T&) ) {
return (*f)(x);
};
int main() {
tuple<int,int> tpl(42,43);
cout << tpl * get<0>;
}
是否可以operator*
接受f
任意返回类型?
更新 - GCC 错误? 代码:
#include <tuple>
template<typename T, typename U>
U operator* (T x, U& (*f)(T&) ) {
return (*f)(x);
};
int main() {
std::tuple<int,int> tpl(42,43);
return tpl * std::get<0,int,int>;
}
使用 gcc462 和 453 编译和运行正确,但使用 gcc471 和 480 被拒绝。因此可能是 GCC 回归错误。我已经提交了错误报告: http ://gcc.gnu.org/bugzilla/show_bug.cgi?id=54111
编辑 我已将示例更改为使用元组作为 arg - 在前面的示例中可以简单地推断出返回类型。
EDIT2
很多人不明白需要什么,所以我改变了call
功能以operator*
使示例更真实。