【问题标题】:Can a std::function store pointers to data members?std::function 可以存储指向数据成员的指针吗?
【发布时间】:2016-05-28 03:20:28
【问题描述】:

cppreference,我发现:

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

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

operator() 在这种情况下应该如何表现?
来自documentation

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

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

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

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

【问题讨论】:

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


【解决方案1】:

调用std::function&lt;R(ArgTypes...)&gt;的函数调用运算符的效果:

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 类的成员数据的指针并且t1T 类型的对象或 对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

【讨论】:

  • 作为函数的返回类型数据成员的实际类型,对吧?
  • INVOKE末尾的R表示“隐式可转换为R”,所以存储的数据成员的类型可以转换std::function 定义的内容
  • 哇,比我想象的还要强大。我仍然看不到这种功能的任何实际用途,但这不能减少它的美丽!非常感谢您的回复,像往常一样,非常感谢。 :-)
  • @skypjack 它们作为投影非常有用。
  • @T.C.听起来很有趣,你知道我想理解!! :-) ...您是否可以通过这样的使用示例再添加一个答案?它肯定会得到我的支持。
猜你喜欢
  • 2017-08-27
  • 1970-01-01
  • 2013-05-07
  • 2018-08-08
  • 1970-01-01
  • 2014-02-19
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
相关资源
最近更新 更多