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

时间:2016-02-16 17:41:21

标签: c++ c++11 stl std-function data-members

cppreference,我发现:

  

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

我不明白为什么std::function应该能够存储这样的指针,而且我之前从未听说过这个功能。
它真的有可能,我错过了某些文件中的错误或错误吗?

operator()在这种情况下应如何表现? 从documentation开始:

  

使用参数args。

调用存储的可调用函数目标

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

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

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

1 个答案:

答案 0 :(得分:24)

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.*fN == 1f是指向类Tt1的成员数据的指针时类型为T或a的对象   引用类型为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));

DEMO

相关问题