【问题标题】:Vector of member functions [duplicate]成员函数的向量 [重复]
【发布时间】:2018-07-30 20:05:11
【问题描述】:

使用向量来安排类的方法调用的方法是什么。我想要一个方法向量,如下所示:

class Model {
    using task_t = std::function<void()>;
    std::vector<std::vector<task_t>> _frameTasks;

    void add_function() { _frameTasks[3].push_back(&(this->function()); }
    void function() {std::cout << "hi"; }
    void step() {
         for (auto task : _frameTasks[3]) task();
    }
}

但是编译器抱怨:

error: ISO C++ forbids taking the address of a bound member function to form a pointer to member function. 

我该如何解决这个问题或正确的方法是什么?

【问题讨论】:

  • 你需要使用std::bind,看这里:stackoverflow.com/questions/37636373/…
  • 函数指针写成&amp;Model::function。 (但它的类型是void(Model::*)()
  • 使用void add_function() { _frameTasks[3].push_back(std::bind(&amp;Model::function, this)); }
  • 或者忘记所有关于std::bind 并使用push_back( [this](){ function(); } )。而且通常更喜欢for ( auto&amp;&amp; var : range ) 而不是for ( auto var : range )
  • @aschepler 哦,这是一个很好的解决方案,谢谢!

标签: c++


【解决方案1】:

&amp;(this-&gt;function())&amp; 应用于调用function() 成员函数的结果。默认的operator&amp; 需要左值,但是表达式this-&gt;function() 不是左值。

&amp;Model::function 也不起作用,因为它是一个指向成员函数的指针(而不是一个指向函数的指针)。它的类型是void (Model::*)(),即:指向Model的(非static成员函数的指针,它不接受任何参数并且不返回任何内容。

您需要某种方法来指定function() 成员函数 将在其上调用的Model 对象

从 C++11 开始,您只需使用 lambda expression 即可实现:

void add_function() {
    _frameTasks[3].push_back(
        [this](){ add_function(); }
    );
}

【讨论】:

  • &amp;(this-&gt;function()) 不是指向成员函数的指针。它立即调用该函数并尝试获取返回值的地址(如果返回类型为void,则该地址无效)。 &amp;Model::function 是指向成员函数的指针的唯一语法。
  • 谢谢,这是完全错误的。无论哪种方式,我认为&amp; 需要一个左值,不是吗?所以即使是非void也行不通。
  • @BaummitAugen 好点。现在的问题是:Modeloperator&amp; 可以在Model 的定义之外重载吗?如果是这样,OP 不妨考虑std::addressof() 而不是operator&amp;
  • 确实可以。 wandbox.org/permlink/Q4u9vvLAsH2K9et4 当然不是针对实际的函数类型。
猜你喜欢
  • 1970-01-01
  • 2020-09-06
  • 2017-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 2018-01-05
  • 1970-01-01
相关资源
最近更新 更多