Этот вопрос является продолжением How to deduce the type of the functor's return value? Я переформулирую его более абстрактным образом.Общий способ вывода возвращаемого типа функтора?
Учитывая псевдокод шаблонной функции
template <typename Arg, typename Fn>
auto ComputeSomething(Arg arg, Fn fn) -> decltype(<decl-expr>)
{
// do something
// ............
return fn(<ret-expr>)
}
где <ret-expr>
произвольное выражение, которое включает в себя arg
, что я буду использовать для <decl-expr>
, чтобы установить тип возвращаемого ComputeSomething
равного типа возвращаемого функтора.
Функтор может быть классом, лямбдой или указателем функции.
Частичные решения, которые я нашел до сих пор.
(a) Ответ на мой связанный вопрос, сделанный ecatmur. По существу, он повторяет оператор возврата в <decl-expr>
. Проблемы: он подвержен ошибкам и не работает, если содержит локальные переменные.
(б) работает только для указателей на функции
template <typename Arg, typename Ret>
Ret ComputeSomething(Arg arg, Ret(*fn)(Arg))
(с) предполагает, что аргумент функтора типа Arg
(который не может держать в целом) и требует Arg
быть default- построимо
template <typename Arg, typename Fn>
auto ComputeSomething(Arg arg, Fn fn) -> decltype(fn(Arg())
(д) Использование std::declval
, который, как предполагается, чтобы снять ограничение по умолчанию-конструктивны, как это было предложено в how to deduce the return type of a function in template. Может ли кто-нибудь объяснить, как это работает?
template <typename Arg, typename Fn>
auto ComputeSomething(Arg arg, Fn fn) -> decltype(fn(std::declval<Arg>())
Мне жаль это говорить, но AFAIK это не представляется возможным, потому что возвращение трейлинг не видит шаблон функции определяется, в то время как body делает. –