37

cppreference,我发现:

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

我不明白为什么 astd::function应该能够存储这样的指针,而且我以前从未听说过该功能。
真的有可能吗,我错过了什么或者文档中有错误?

operator()在这种情况下应该如何表现?
文档中:

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

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

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

template< class R, class... Args >
class function<R(Args...)>
4

1 回答 1

26

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

R operator()(ArgTypes... args) const

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

INVOKE<R>(f, std::forward<ArgTypes>(args)...)

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

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

[...]

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

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

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

f(std::make_pair(1, 2));

演示

于 2016-02-16T18:07:33.643 回答