首页 文章

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

提问于
浏览
37

cppreference,我发现:

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

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

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

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

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

说实话,我甚至无法弄清楚's the right syntax for such a function, otherwise I'已经写了一个例子来测试它 .
如何使用以下模板来定义指向数据成员的指针?

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

1 回答

  • 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 . * f当N == 1且f是指向T类成员数据的指针时t1和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));
    

    DEMO

相关问题