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