将函数放入向量中并执行

Put functions into vector and execute

本文关键字:执行 向量 函数      更新时间:2023-10-16

我想制作一个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的参数一起放入执行吗?

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

使用参数->我的函数(从program_data称为function foo exam)使用参数执行一些操作。

例如:通常我执行此函数:

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

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

当然,使用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来填充向量;您还可以将lambdas与捕获、绑定表达式(std::bind)和其他可调用对象一起使用。

如果将lambda与捕获一起使用,则需要确保捕获的变量要么按值捕获,要么具有包含可调用集合的生存期:

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

我建议使用std::函数和lambda表达式:

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

这会在向量"函数"中添加一个函数。通过调用functions[0](),这将调用lambda表达式,然后lambda表达式调用以123456和"str"为参数的函数。

您可以使用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编译器。