存储在向量中的 C++ std::function 不起作用

Posted

技术标签:

【中文标题】存储在向量中的 C++ std::function 不起作用【英文标题】:C++ std::function stored in vector doesn't work 【发布时间】:2016-01-17 10:39:40 【问题描述】:

以下代码有效:

float value = 3.0f;
auto f = std::bind(&MyClass::doSomething, this, value);
f();

但是,一旦我尝试将函数存储在 std::vector 中,它就不允许我调用该函数:

float value = 3.0f;
auto f = std::bind(&MyClass::doSomething, this, value);

std::vector<std::function<void(float)> > list;
list.push_back(f);
list.back()();

这是编译器错误:

No matching function for call to object of type 'value_type' (aka 'std::__1::function<void (float)>').  Candidate function not viable: requires 1 argument, but 0 were provided.

我已经有一段时间没有被这样难住了。如果我尝试将 lambda 绑定到浮点值而不是使用成员函数,则会出现同样的问题。

【问题讨论】:

请稍稍回过头来告诉我们目标。我认为您从错误的角度解决了这个问题。有一个更简单的解决方案 嗯,第一个没有std::function参与?第二个在最后一行代码之前有一个错误,并且该错误不需要涉及vector。检查std::function&lt;void(float)&gt; f2 = f; 我猜MyClass::doSomething 不需要两个浮点数? 请发帖MCVE 【参考方案1】:

因为你说std::function 对象有一个参数,但是你在调用函数对象时没有提供参数。事实上,std::bind 返回的可调用对象接受任何参数,所以std::function 对象也不应该:

std::vector<std::function<void()> > list;

【讨论】:

【参考方案2】:

好吧,vector 中的函数类型需要一个你没有给出的浮点数。请改用std::vector&lt;std::function&lt;void(void)&gt; &gt;

【讨论】:

以上是关于存储在向量中的 C++ std::function 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

c++中的函数向量

C++ std::vector 作为 std::function 的参数

C++ std::function怎么用

C++ std::function技术浅谈

c#中的委托和c++中的bind/function对比

muduo库中的核心:std::bind和std::function