Как определить сигнатуру функции вызываемого объекта?

Есть ли способ в C ++ определить сигнатуру функции вызываемого объекта?

Рассмотрим следующее:

template< typename F >
void fun(F f)
{
    // ...
}

Предположим, что fun - это вызывается только с вызываемыми "вещами".

Внутри fun Я хочу знать, какова сигнатура функции f . Это должно работать с указателями функций, ссылками, оболочками, лямбда-выражениями, привязками, объектами функций (при условии, что у них есть только один operator () ) и так далее. Я ограничен Visual Studio 2010 SP 1, но меня интересуют стандартные решения, даже если я не работаю с этим компилятором.

(Сигнатура функции - Return_Type ([Arg1_Type [, Arg2_Type [, ...]]] ) ; то же, что и для std :: function / boost :: function . )

Частичное решение узнать хотя бы возвращаемое значение f имеет некоторую ценность. (Я пробовал std :: result_of , но ни в коем случае не смог заставить его работать.)

17
задан Adam Badura 9 May 2011 в 13:23
поделиться