. Мне нужно передать функцию оператору. Любая унарная функция, имеющая правильный тип аргумента. Тип возвращаемого значения может быть любым. Поскольку это библиотечный код, я не могу обернуть его или привести f
к конкретной перегрузке (за пределами operator*
).. Функция принимает operator*
1-й аргумент в качестве собственного аргумента. Искусственный пример ниже компилирует и возвращает правильные результаты. Но у него жестко закодирован возвращаемый тип int
— чтобы этот пример компилировался.
#include
#include
using namespace std;
template
int operator* (T x, int& (*f)(T&) ) {
return (*f)(x);
};
int main() {
tuple tpl(42,43);
cout << tpl * get<0>;
}
Можно ли заставить operator*
принимать f
с произвольным типом возврата?
ОБНОВЛЕНИЕ -Ошибка GCC? Код:
#include
template
U operator* (T x, U& (*f)(T&) ) {
return (*f)(x);
};
int main() {
std::tuple 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
РЕДАКТИРОВАТЬ Я изменил пример, чтобы использовать кортеж в качестве аргумента -, в предыдущем примере можно было тривиально вывести тип возвращаемого значения.
РЕДАКТИРОВАТЬ2 Многие люди не могли понять, что нужно, поэтому я изменил функцию call
на operator*
, чтобы сделать пример более реальным.