Может кто-нибудь объяснить, как использовать result_of в шаблоне?

0

Я пытаюсь создать объект с задержкой вызова. Что-то вроде строк (псевдокода):

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 с параметром шаблона, когда параметр шаблона представляет подпись функции?

  • 0
    Я, наверное, совершенно std::result_of<decltype(FN)> твоему вопросу, но я думаю, что std::result_of<decltype(FN)> - это то, что ты ищешь.
  • 0
    возможный дубликат вывода типа указателя на функцию
Показать ещё 2 комментария
Теги:
templates
result-of

1 ответ

1
Лучший ответ
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.

  • 0
    Это значит, что: что если вы хотите отложить вызов лямбда-функции или std::function ?
  • 0
    Это помогает? stackoverflow.com/questions/7943525/...
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню