如何捕获函数参数并存储函数指针以供以后在 C++11 中执行?
How to capture function arguments and store function pointer for later execution in C++11?
我的要求是存储一些函数,以便以后使用预定义的参数执行。这是我尝试过的
void doSomething(int i, int j) {
std::cout << "Sum " << i + j << std::endl;
}
int main(int argc, char *argv[]) {
std::vector<std::function<void(int, int)>> functionVector;
functionVector.push_back(std::bind(doSomething, 1, 2));
functionVector.push_back(std::bind(doSomething, 4, 2));
functionVector[0]();
functionVector[1]();
}
但是这不会编译并给出以下错误
error: no matching function for call to object of type 'std::__1::__vector_base<std::__1::function<void (int, int)>,
std::__1::allocator<std::__1::function<void (int, int)> > >::value_type' (aka 'std::__1::function<void (int, int)>')
functionVector[0]();
^~~~~~~~~~~~~~~~~
我怎样才能在C++11/14
实现这一目标?
将参数绑定到函数后,调用不再接受任何进一步的参数。因此,函数类型应void()
:
std::vector<std::function<void()>> functionVector;
另请注意,您可以在 C++11 及更高版本中使用 lambda,它们比std::bind
更灵活:
functionVector.push_back([](){ doSomething(1, 2); });
functionVector.push_back([](){ doSomething(4, 2); });
或者稍微简化,可以省略空参数列表:
functionVector.push_back([]{ doSomething(1, 2); });
functionVector.push_back([]{ doSomething(4, 2); });
如您所见,lambda 在这里没有任何参数,因此它们的调用运算符的类型是void()
.
虽然它不会有任何真正的区别,但我也建议您使用emplace_back
(自 C++11 起(而不是push_back
.
push_back
期望对元素类型的引用(此处std::function<void()>
(,但由于您要传递其他内容,因此std::function<void()>
将首先构造为push_back
参数的临时参数,然后从中移动构造向量元素。
另一方面,emplace_back
需要矢量元素的构造函数参数,并将直接就地构造std::function<void()>
对象,而无需中间临时对象。
在此特定实例中,使用 lambda 时也不需要std::function
,因为没有捕获的 lambda 会衰减到函数指针,您可以将其存储为std::function
的轻量级替代方案:
std::vector<void(*)()> functionVector;
如果您打算存储带有捕获功能的 lambda,则需要std::function
方法。
相关文章:
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 为什么 -mmacosx-version-min=10.10 不阻止使用标记为从 10.11 开始的函数?
- C++11:模板方法的模板函数调用无法编译?
- 为什么即使调用了析构函数,C++11 中的分离线程也可以执行
- MacOS 上的 Xcode 11 项目不在一个函数中使用 sin 和 cos:未定义的符号"___sincosf_stret"
- 如何使用类模拟 C++11 中的 lambda 函数和闭包?
- 为什么 c++11 std::normal_distribution 在从函数调用时返回相同的模式?
- 分段故障 11,从类函数显示动态 C 字符串
- C++11:将矢量元素作为线程传递到线程函数中
- 在 C++11 函数中使用尾随返回类型的优点
- 外部函数在 main() 上调用时返回分段错误 11.(C++)
- 移动构造函数 C++11
- 构造函数中调用没有匹配函数 - C++ 11
- 使 C++14 constexpr 函数C++11 兼容
- 将成员函数作为参数传递给其他成员函数 (C++ 11 <function>)
- 是否可以将 std::move 对象移出函数?(C++11).
- 如何使用模板函数C++ 11 的 using 关键字来删除作用域中的命名空间
- 我可以在std::函数中使用模板类型T来传递lambda类型的函数C++11吗
- 防止重写和/或隐藏基类函数(C++11)
- 函数c++ 11奇怪的行为