2016-06-01 8 views
3

Глядя на реализацию std::reference_wrapper hereРеализация станд :: reference_wrapper

Конструкторы и операторы очевидны для меня, но я не понял эту часть

template< class... ArgTypes > 
typename std::result_of<T&(ArgTypes&&...)>::type 
    operator() (ArgTypes&&... args) const { 
    return std::invoke(get(), std::forward<ArgTypes>(args)...); 
} 

Может кто-то упростить его я ... был бы оценен

Редактировать: и было бы здорово дать полезный пример для operator() of std::reference_wrapper

+2

В принципе, он направляет 'operator()' рефери Functor. – Jarod42

ответ

3

Это определяет функцию-член operator(), которая применима для std::reference_wrapper, обертывая ссылку на вызываемую. Целью этого является вызов базовой Callable.

  • Параметр шаблона class ... Args должен сделать его общим с точки зрения параметров, которые могут быть переданы в базовую вызываемую.
  • Возвращаемый тип оператора должен быть тип возвращаемого значения производится путем вызова отзывной, который получен с помощью typename std::result_of<T&(ArgTypes&&...)>::type части
  • Он использует invoke вызов как общего назначения, способ вызова отзывной, который работает независимо от какой тип Callable является (Functor, указатель функции, указатель на функцию-член и т. д.).
  • Он использует std::forward при передаче списка аргументов для достижения perfect forwarding - так, например, lvalue и rvalues, переданные исходному вызову, сохраняют их l/rvalue-ness в базовом вызове.
+0

Вы могли бы привести пример для оператора() из std :: reference_wrapper – Laith

Смежные вопросы