【问题标题】:How do I pass a function as parameter?如何将函数作为参数传递?
【发布时间】:2012-11-25 05:30:20
【问题描述】:

在一行中不使用 std 库以外的其他库的情况下,将函数作为另一个函数的参数传递的最快和最短的方法是什么?

我的意思是,假设我们有一个函数 forloop(int x, *) {...},它运行一个从 0x 的 for 循环,运行 * 函数;函数调用应该类似于:forloop(3, **() { std::cout "Hi!"; });

PS:*** 只是逐个函数类型的占位符以及将函数作为参数传递的方式。

【问题讨论】:

标签: c++


【解决方案1】:

C++11 提供匿名函数:

forloop(3, []{ std::cout "Hi!"; });

示例

#include <iostream>
#include <functional>

 void forloop(int times, std::function<void()> f) {
     for(int i = 0; i < times; i++) {
         f();
     }
 }

int main() {
    forloop(3, [] () { std::cout << "Hello world"; });
}

【讨论】:

  • * 的类型是什么?
  • @Jeffrey 类型是std::function&lt;void()&gt; - 包括
  • @phant0m:不,它可以转换std::function&lt;void()&gt;。其具体类型未指定,但可以通过decltype获取
  • @ArmenTsirunyan 我在测试的时候做了,我只包括它,因为他问能不能通过它。
  • 我现在很困惑。我试过你的方法(std::function)但没有成功。如果我要像您的第一个示例一样使用 forloop 的原型,您能否举个例子?
【解决方案2】:

如果您的函数是任何类的成员,请尝试“指向成员函数的指针”。

【讨论】:

    【解决方案3】:

    您正在考虑几个选项。

    1. 函数指针,C 风格的方式
    2. std::function 是 C++ TR1 和 C++11 的一部分
    3. 使用函子和std::ptr_fun 调整您的函数

    您展示的语法仅适用于 C++11。早期的 C++ 版本不提供定义匿名函数的可能性。

    【讨论】:

    • 我没有使用任何语法,我只是发明了它。 *** 会用什么替换(如果我有 C++11)?
    猜你喜欢
    • 2014-06-29
    • 2021-01-14
    • 2016-07-23
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-13
    相关资源
    最近更新 更多