Как получить возвращаемый тип вызова функтора с другим типом?

#c #templates #c 11

#c #шаблоны #c 11

Вопрос:

Заданные типы TArgument и TFunctor , как я могу узнать результирующий тип вызова экземпляра TFunctor с аргументом типа TArgument ?

Это мое неуклюжее, грязное решение:

 template <class TFunctor, typename TArgument>
class ReturnValue
{
public:
     typedef decltype(functor_(arguent_)) Type;

private:
     static TFunctor functor_;
     static TArgument arguent_;
}
  

но для того, чтобы это работало, оба TFunctor и TArgument должны быть конструктивными по умолчанию.

Есть ли лучший способ?

Ответ №1:

 typedef decltype(std::declval<TFunctor>()(std::declval<TArgument>())) Type;
  

Или с помощью std::result_of :

 typedef typename std::result_of<TFunctor(TArgument)>::type Type;