Как передать перегруженную функцию оператору?

. Мне нужно передать функцию оператору. Любая унарная функция, имеющая правильный тип аргумента. Тип возвращаемого значения может быть любым. Поскольку это библиотечный код, я не могу обернуть его или привести 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*, чтобы сделать пример более реальным.

6
задан 19 revs, 2 users 88% 28 July 2012 в 07:52
поделиться