我正在为运行函数创建一个队列。我将需要被调用的函数放入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
答案 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
名称空间。