将函数放入向量中并执行
Put functions into vector and execute
我想制作一个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编译器。
- C++ 随机数生成器:尝试将结果作为向量获取,但通过制作 void 函数来执行此操作而出现错误
- 手动执行C++向量
- 执行错误访问 遍历向量
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- 基于整数向量执行位排列的有效方法?
- 如何对字符向量执行大整数乘法
- 用向量执行长长的乘法
- 如何在C 对向量的第二个元素上执行较低的操作
- 有没有一种 stl 方法来执行指针向量的深度复制
- 调用向量内的函数指针不执行任何操作
- 我们可以使用Back() - 值索引在其上执行向量插入
- 在向量和映射上执行擦除(迭代器)时观察到的不同行为
- 一次遍历 8 个向量字节并执行按位运算
- while(getline(myReadFile, temp, ':')) 执行一次迭代太多导致向量越界
- Boost绑定和Boost函数,将带有参数的函数存储在向量中,然后执行它们
- 使用 GCC 4.8 编译时无法对向量执行 std::swap
- 如何在执行/编译(c++)时将元素添加到数组/向量中
- 通过引用传递C++向量,然后执行 push_back()
- 为什么我不能在类和函数中实现向量C++执行此代码?
- 如果我有一个字符串向量,如何使用带execvp的字符串来执行命令