【问题标题】:How do you create a smaller function from a bigger function?你如何从一个更大的函数中创建一个更小的函数?
【发布时间】:2013-03-12 14:01:54
【问题描述】:

假设我有一个函数int func(int x, int y, int z),我需要在另一个函数中调用它10 次,即int runge(int, ... , int func(int a, int b))。 我知道我可以创建 10 个函数,即

 int runge1(int a, int b) {return func(1, a, b);}

但是,我想要一种更简单的方法。 基本上我想这样创建一个函数指针:

for(int i=0; i<10; i++)
    {
    //func would have two variables input into it, variable1, variable2
    int (*func)=func(i, variable1, variable2);
    }

【问题讨论】:

  • 对不起,您关于在另一个函数中调用函数 *10 次的示例完全没有说明问题。也许通过扩大一点(即i = 1, 2, 3, ...)你的问题会变得更清楚。
  • 感谢您的帮助,抱歉我的问题不清楚。我需要等待一分钟才能接受正确答案,但感谢您的帮助。

标签: c++ function pointers


【解决方案1】:

你正在寻找std::bind:

std::function<int(int,int)> f = std::bind(&func, i, std::placeholders::_1, std::placeholders::_2);

这会将i 绑定到func 的第一个参数,而其余参数未绑定。然后你可以像这样调用f

f(1, 2);

如果您愿意,可以将所有新绑定的函数推送到std::vector

using namespace std::placeholders;
std::vector<std::function<int(int,int)>> funcs;
for (int i = 0; i < 10; i++) {
  funcs.push_back(std::bind(&func, i, _1, _2));
}

如果您没有 C++11,则有一个 boost::bind 对应项。

【讨论】:

    【解决方案2】:

    根据您的描述,我不能 100% 确定,但看起来您正在寻找 curry 函数。

    在 C++ 中,这是一个很好的例子:How can currying be done in C++?

    【讨论】:

    • 该示例相当陈旧,其中提到的那些绑定器已被新标准弃用,具有 std::bind 和 lambdas。
    【解决方案3】:

    我很确定你想知道std::function、Lambdas,也许还有std::bind

    int func(int x, int y, int z);
    
    typedef std::function<int(int,int)> FuncT;
    std::array<FuncT, 10> functions; //or whatever container suits your needs
    for (int i = 0; i < 10; ++i)
    {
      functions[i] = [=](int a, int b) { return func(i,a,b); }; //with lambdas
      functions[i] = std::bind(func, i, std::placeholders::_1, std::placeholders::_2); //with bind
    }
    

    (我更喜欢 lambdas,但这只是个人喜好问题......)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多