c ++函数队列

时间:2014-03-01 03:02:10

标签: c++

所以我有多个方法使用不同的参数:

class c;

void c::foo1(int a) {

}

void c::foo2(int a, int b) {

}

我如何拥有这些功能的队列/载体?它不一定是std :: function对象,但我需要一种方法来排队函数的执行。

3 个答案:

答案 0 :(得分:10)

您的问题有点模糊,但如果您在将函数插入队列时已经知道目标对象和调用的参数,则可以使用无参数lambda的队列:

std::deque<std::function<void()>> q;
c x;
q.push_back( [&x] { x.foo1(1); } );
q.push_back( [&x] { x.foo2(2,3); } );
// ... some time later we might want to execute the functions in the queue ...
while (!q.empty())
{
    q.front()();
    q.pop_front();
}

答案 1 :(得分:0)

简短的回答是,你不能。围绕这个的一个半直接的​​方法是使所有函数采用参数的列表或向量,其中每个参数是一个int,或者如果你需要支持更多的参数类型,一个Boost Variant。然后所有函数都可以具有相同的签名,并且它们的实现将需要解压缩它们的参数。

如果所有方法都在一个类中,您可以将它们存储在列表中作为成员函数的普通指针。这比将它们存储在std :: functions中更有效,如果你可以逃脱它,那就更清楚了。

答案 2 :(得分:0)

你的意图不清楚。扩展@ JohnZwicnk的答案......

函数签名包括它的返回类型,它的类对象类型(如果它是类成员函数)及其参数 - 这意味着没有简单的方法来创建一个共同的'函数类型'。

这并不意味着你不能将不同类型的函数分配给同一个对象类型 - boost :: function和boost :: mem_function是关于如何将带参数的泛型函数“赋值给”对象并传递的两个例子在它被召唤之前它。

如果您打算只是顺序调用每个函数而不关心类型,请查看functors或前面提到的boost :: mem_function。这两种方法都允许您将参数绑定或赋值给函数调用,并延迟函数的评估以供日后使用。