Я провел некоторое исследование по std::result_of<>
и знаю, как оно используется на высоком уровне, но все еще довольно запутался в этой магической вещи.
Так что, если я правильно понимаю, формаR (Args..)
должен интерпретироваться компилятором как тип функции, принимающий аргументы типов Args...
и возвращающий тип R
, и использование очень оправдано при указании std::function<int(int)>
, который объявляет тип функции, принимающий int
в качестве единственного аргумента и возвращая int
.
Однако значение вышесказанного внезапно меняется, когда используется то же понятие в контексте std::result_of<F(Args...)>
(обратите внимание, что я изменил R
на F
и удалил
(пробел) между F
и (
, чтобы обозначить разницу - согласно cppreference значение F(Args...)
становится выражением INVOKE
времени компиляции - я имею в виду, я вроде понимаючто основная цель std::result_of<F(Args...)>
состоит в том, чтобы использовать понятие INVOKE
, чтобы выбрать правильную перегрузку (если имеется более одной перегрузки), и, конечно, вывести значение возвратаpe такого вызова (во время разрешения времени компиляции) - фактически, это было бы примерно так: decltype(std::declval<F>()(std::declval<Args>()...))
- однако понятие F (Args...)
- по сравнению с std::function<R (Args...)>
- было бы интерпретировано компилятором какТип функции принимает Args...
и возвращает тип F
, где теперь F
- это тип функции, который мы пытаемся получить тип возвращаемого значения!
Конечно, с помощью decltype
и std::declval
, реализация std::result_of
кажется разумной, но я читал, что boost как-то реализовал result_of
в C ++ 98/03, где decltype
и std::declval
не существовало - мне интересно, как бы этовозможно (возможно, с некоторыми очень хитрыми приемами)?
Итак, еще раз: понятие R (Args...)
в контексте аргумента шаблона всегда интерпретируется / выводитсякак тип функции с типом возвращаемого значения R
, независимо от того, является ли включающий шаблон std::function<>
или std::result_of<>
?в то время как std::result_of<>
каким-то образом интерпретирует «тип возвращаемого значения» F
и «возвращает» фактический тип возвращаемого значения, определенный std::result_of<F(Args...)>::type
?Или std::result_of<F(Args...)>
просто интерпретирует F(Args...)
по-разному, поэтому он знает, что это волшебное INVOKE
выражение?
Спасибо за ваше предстоящее разъяснение!