Есть ли способ в С++ определить подпись функции вызываемого объекта?
Рассмотрим следующее:
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, но не смог заставить его работать в любом случае, я попробовал.)