Я часто нахожу, что имею дело с шаблонами и возвращает значения функций в указанных шаблонах. И я всегда в конечном итоге с чем-то вроде этого:Возвращаемый тип вызова функции в аргументе шаблона класса
template<typename Data>
auto foo(const Data& d) ->
typename std::decay<decltype(reinterpret_cast<const Data*>(0)->operator()(0, 0))>::type
{
typedef typename std::decay<decltype(reinterpret_cast<const Data*>(0)->operator()(0, 0))>::type return_t;
...
}
В то время как это работает, это некрасиво и не совсем очевидно, что я хочу от беглого взгляда. Есть ли более читаемый, менее «хакерский» способ получить «возвращаемый тип вызова этого метода в аргументе шаблона»?
Вы уверены, что хотите разложить тип, или он может быть таким же, как и для 'operator()'? –
В этом случае я хочу разложить его. Даже если 'operator()' возвращает 'const T &', я хочу вернуть 'T', потому что я создаю новые значения путем интерполяции в этом конкретном случае. –
может 'Data' быть функцией, или он должен быть классом с' operator() '? –