Я пытаюсь создать объект с задержкой вызова. Что-то вроде строк (псевдокода):
template <class FN>
struct delayable_call
{
return-type-of-FN call(); // <-- I'd like to use result_of here.
template<class ArgTypes...>
delayable_call(FN* pFn, ArgTypes... args);
FN* fn;
args-saving-struct;
};
Я попытался использовать result_of :: type для типа возвращаемого вызова, но получаю ошибки во время создания шаблона, потому что, по-видимому, типы аргументов нужно указывать отдельно.
Конкретизация:
int foo(bool, double); // function prototype.
delayable_call<int(bool, double)> delayable_foo(foo, false, 3.14); // instantiation
Сообщения об ошибках и документация, которые я прочитал о result_of, как представляется, указывают на то, что типы аргументов также должны быть указаны. Поэтому вместо result_of<FN>::type
, мне нужно указать result_of<FN(bool, double)>::type
. Это действительно устраняет проблему компиляции, которую я имею, но нарушает общность шаблона.
Итак, как я могу использовать result_of с параметром шаблона, когда параметр шаблона представляет подпись функции?
template <class FN> struct delayable_call;
template<class R, class...Args> delayable_call<R(Args...)>{
typedef R(*)(Args...) pFN;
замените ваш delayable_call
на специализацию, и вы выделите как R
и Args...
Вам нужен Args...
или иначе сохранить параметры.
Однако задержка с задержкой в библиотеке закончится стиранием типа. Самый простой способ - простая std::function<R()>
где вы вставляете в нее лямбда:
int foo(double);
double x = 7;
std::function<int()> delayed_foo = [x]{ return foo(x); }
и захватывать по значению, если вы действительно не имеете в виду это, чтобы захватить по ссылке.
Вы можете вывести R
через:
template<typename Fn, typename... Args>
std::function< typename std::result_of<Fn(Args...)>::type()>
make_delayed_call( Fn&& fn, Args&&... args ) {
return [=]{ return fn(std::move(args)...); }
}
который должен вывести ваш R
из вызываемого объекта и аргументов. Это захватывает все путем копирования - захвата путем перемещения требуется либо более шаблонный, либо С++ 14.
std::function
?
std::result_of<decltype(FN)>
твоему вопросу, но я думаю, чтоstd::result_of<decltype(FN)>
- это то, что ты ищешь.