函数/方法指针推送到Deque

时间:2014-06-03 12:12:02

标签: c++ function-pointers deque member-function-pointers

我正在为运行函数创建一个队列。我将需要被调用的函数放入std::deque<bool(*)()>然后我循环通过deque调用每个函数并让它运行,有时甚至根据返回做事。

我遇到的问题实际上是将这些功能放在双端队列中。

我在名为A2_Game的类中有这个双端队列。我还有一个名为Button的课程。

我的代码类似于以下内容:

class Button
{
    bool DoInput();
}

class A2_Game
{
    std::deque<bool(*)()> Input_Functions;
    bool EnterName()
}

A2_Game::OtherMethod()
{
    Button* btn1 = new Button();
    Input_Functions.push_back(&A2_Game::EnterName); //The compiler told me to do this and it still won't compile the line..
    Input_Functions.push_back(btn1->DoInput);

    //Loop
}

我无法确定如何修复编译错误。我怀疑你们中的一些人可能只是通过查看我在这里展示的内容,直接告诉我需要更改/完成哪些内容才能编译。如果是!true,那么这里是编译错误。

error C2664: 'std::deque<_Ty>::push_back' : cannot convert parameter 1 from 'bool (__thiscall A2_Game::* )(void)' to 'bool (__cdecl *const &)(void)'

error C3867: 'Button::Doinput': function call missing argument list; use '&Button::Doinput' to create a pointer to member

2 个答案:

答案 0 :(得分:4)

如果你想推回功能你可以使用std::function(如果你的编译器不支持c ++ 11,则提升)

std::deque<std::function<bool()> > function_list;
Button* btn1 = new Button();
function_list.push_back([this](){return EnterName();});
function_list.push_back([btn1](){return btn1->DoInput();});

当你从function_list调用时,确保lambda中的所有内容仍然有效。

编辑: 提升等价物

std::deque<boost::function<bool()> > function_list;
Button* btn1 = new Button();
function_list.push_back(boost::bind(&A2_Game::EnterName,this));
function_list.push_back(boost::bind(&Button::DoInput,btn1));

答案 1 :(得分:2)

问题是类方法的签名与函数签名bool (*)()不匹配。这两种方法的签名分别为bool (Button::*)();bool (A2_Game::*)();。 (该方法所属的实际类是其签名的一部分!)

这里的解决方案是使用仿函数/函数对象。函数是&#34;可调用元素周围的包装对象&#34;如果你想处理像对象这样的函数(在OOP意义上),这是很有用的。如果您有boost,那么您的代码可能与此类似(代码编译):

#include <boost/function.hpp>
#include <deque>

class Button
{
public:
    bool DoInput() { return true; }
};

class A2_Game
{
public:
    typedef boost::function<bool()> Functor;
    std::deque<Functor> Input_Functions;
    bool EnterName() { return true; }
    void OtherMethod();
};

void A2_Game::OtherMethod()
{
    Button* btn1 = new Button();
    Input_Functions.push_back(boost::bind(&A2_Game::EnterName, this));
    Input_Functions.push_back(boost::bind(&Button::DoInput, btn1));
}

boost::bind将函数指针与对实际类实例的引用相结合,并返回与A2_Game::Functor相同类型的函数对象。

请注意,boost::function已集成到C ++ 11标准中(请参阅here),因此,如果您的项目支持C ++ 11,只需使用#include <functional>和{{1}而不是std名称空间。