将函数放入向量并执行

时间:2014-09-02 16:23:34

标签: c++ c++11 vector

我想将vector / deque作为函数容器。

这种包含必须使用不同的参数来使用不同的函数。

示例功能:

program_data::getInstance().function(int,std::string);
program_data::getInstance().foo(int);
program_data::getInstance().exam(int,std::string,double);

您是否可以通过参数std :: vector / std :: deque和执行来显示示例代码 put 这些函数?

我认为我应该使用std :: function和std :: bind,但我不知道如何使用不同的args大小来支持不同的函数。

带参数 - >我的函数(在function中称为foo exam program_data)使用参数执行某些操作。

例如:通常我执行此功能:

program_data::getInstance().function(10,"halo");

现在我想将这些函数放到std::vector // deque并使用我放入函数的参数执行。即(如果我把函数放在vector上面并使用(伪代码)vector[0].run();那么我的程序运行函数program_data::getInstance().function(int,std::string);

3 个答案:

答案 0 :(得分:11)

当然,使用std::vector<std::function<void()>> - 即类型擦除函数容器的向量,它可以容纳任何可以不带参数调用的对象:

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

// populate the vector
vector.push_back([]{ program_data::getInstance().function(10,"halo"); });

// execute items in the vector
vector[0]();

这里我用无捕捉的lambda填充向量;你也可以将lambda用于捕获,绑定表达式(std::bind)和其他可调用对象。

如果将lambda与捕获一起使用,则需要确保捕获的变量按值捕获或具有包含callables集合的生命周期:

std::string tmp;
vector.push_back([&tmp]{ program_data::getInstance().something(tmp); });

答案 1 :(得分:2)

我建议使用std::functionlambda expressions

std::vector<std::function<void()>> functions;
functions.push_back([](){ program_data::getInstance().function(123, 456, "str"); });

这会在向量&#39;函数中添加一个函数。通过调用functions[0](),这将调用lambda表达式,然后使用123,456和&#34; str&#34;调用你的函数。作为论点。

答案 2 :(得分:1)

您可以使用std::function / std::bind。首先,您需要确定从调用方传递给那些函数的内容,即确定函数签名。原理与虚函数相同。因此,例如,您希望传递一个序列号(调用函数的顺序)并且不返回任何内容:

#include <vector>
#include <functional>

typedef std::function< void( int ) > Function;
typedef std::vector<Function> Functions;


void func1( int seq, const std::string &str );
void func2( const std::string &str );
void func3( int seq );

void run()
{
    Functions functions;
    // populate functions
    functions.push_back( std::bind( func1, std::placeholders::_1, "foobar" ) );
    functions.push_back( std::bind( func2, "foobar too" ) );
    functions.push_back( func3 ); // you can use std::bind here as well, just to show it can be omitted if function signature matches

    // call them
    for( size_t i = 0; i < functions.size(); ++i ) {
        functions[i]( i );
    }
}

这种方法的好处,它可以用于带有boost的预编译c ++ 11编译器。