Может ли std:: function хранить указатели на элементы данных?
Из cppreference я обнаружил, что:
Шаблон класса std:: function - универсальная полиморфная функциональная оболочка. Экземпляры std:: function могут хранить, копировать и вызывать любые вызываемые целевые функции, лямбда-выражения, выражения привязки или другие функциональные объекты, а также указатели на функции-члены и указатели на элементы данных.
Я не понимаю, почему std::function
должен иметь возможность хранить такой указатель, и я никогда раньше не слышал об этой функции.
Возможно ли, я что-то пропустил или что ошибка в документации?
Как должен выглядеть operator()
в таком случае?
Как из документации:
Вызывает сохраненную целевую функцию с параметрами args.
Во всяком случае, для вызова здесь не будет сохранена вызываемая функция-функция. Я не прав?
Честно говоря, я даже не могу понять, какой правильный синтаксис для такой функции, иначе я бы написал пример, чтобы проверить его.
Как можно использовать следующий шаблон для определения указателя на элемент данных?
template< class R, class... Args >
class function<R(Args...)>
Ответы
Ответ 1
Эффект вызова оператора вызова функции std::function<R(ArgTypes...)>
:
R operator()(ArgTypes... args) const
эквивалентно (§ 20.9.11.2.4 [func.wrap.func.inv]/p1):
INVOKE(f, std::forward<ArgTypes>(args)..., R)
определение которого включает следующую марку (§ 20.9.2 [func.require]/p1):
Определите INVOKE (f, t1, t2,..., tN) следующим образом:
[...]
1.3 - t1.*f
, когда N == 1
и f
является указателем на данные элемента класса T
и t1
является объектом типа T
или ссылку на объект типа T
или ссылку на объект типа, полученного из T
;
тогда, когда f
является указателем на элемент данных, сохраненным во внутреннем invoker из std::function
, тогда сам std::function
должен определить один аргумент, например:
std::function<int(std::pair<int,int>)> f = &std::pair<int,int>::first;
f(std::make_pair(1, 2));
DEMO