std :: function可以存储指向数据成员的指针吗?

sky*_*ack 37 c++ stl data-members c++11 std-function

cppreference,我发现:

类模板std :: function是一个通用的多态函数包装器.std :: function的实例可以存储,复制和调用任何Callable目标 - 函数,lambda表达式,绑定表达式或其他函数对象,以及指向成员函数和指向数据成员的指针.

我不明白为什么一个std::function应该能够存储这样的指针,我以前从未听说过这个功能.
它是否真的可能,我错过了某些内容或文档中的错误?

operator()在这种情况下应该怎么做?
文档中可以看出:

使用参数args调用存储的可调用函数目标.

无论如何,这里没有存储的可调用函数目标.我错了吗?

说实话,我甚至无法弄清楚这个函数的正确语法是什么,否则我会写一个例子来测试它.
如何使用以下模板来定义指向数据成员的指针?

template< class R, class... Args >
class function<R(Args...)>
Run Code Online (Sandbox Code Playgroud)

Pio*_*cki 24

调用函数调用运算符的效果std::function<R(ArgTypes...)>:

R operator()(ArgTypes... args) const
Run Code Online (Sandbox Code Playgroud)

相当于(§20.9.11.2.4 [func.wrap.func.inv]/p1):

INVOKE<R>(f, std::forward<ArgTypes>(args)...)
Run Code Online (Sandbox Code Playgroud)

其定义包括以下项目符号(§20.9.2 [func.require]/p1):

定义INVOKE(f,t1,t2,...,tN)如下:

[...]

1.3 - t1.*fN == 1f是指向类的成员数据的指针,T并且t1是类型T的对象T或对类型的对象的引用或对从中派生的类型的对象的引用T;

那么,当f指向存储在a的内部调用者中的数据成员的指针时std::function,那么它std::function本身应该定义一个参数,例如:

std::function<int(std::pair<int,int>)> f = &std::pair<int,int>::first;

f(std::make_pair(1, 2));
Run Code Online (Sandbox Code Playgroud)

DEMO

  • @skypjack它们作为预测非常有用. (2认同)