【问题标题】:Return a function pointer, with variable number of arguments返回一个函数指针,具有可变数量的参数
【发布时间】:2013-03-20 20:24:06
【问题描述】:

我想要做的伪代码是:

function<bool(int)> getFunc(type) // get a function depending on what type is passed

问题是返回的函数必须声明为静态的吗?结果,我无法访问对象属性。所以我需要将它们传递给函数?因此,要返回的原始函数可能如下所示:

bool func1(int)
bool func2(int)

现在需要注入它需要运行的其他对象/参数...

bool func1(int, Class1)
bool func2(int, Class2)

那么如何定义getFunc的返回类型呢?或者也许有更好的方法?

更新

在上面,func* 函数实际上是:has*()。例如。

hasStmtsUsing(variable)
hasVariablesUsed(stmt)

为了确定条件是否为真,它使用了一个对象,例如。 uses。然后还有其他类似的has*() 函数,例如使用对象modifieshasStmtsModifying(variable)usesmodifies是不同类型的对象,本来是对象成员,不需要传入。现在因为函数是static,所以需要传入。

在写这篇文章时,我在想我需要的是某种依赖注入器?也许我传入DI 并调用DI.getX() 函数?

【问题讨论】:

  • 传递可变参数函数听起来像是自找麻烦。你能解释一下你为什么这样做吗? (也可能不可能,因为据我所知,可变参数函数由编译器以特殊方式处理)
  • @Dave,顺便说一句,我更新了我的帖子

标签: c++ functional-programming function-pointers


【解决方案1】:

也许我误解了一些东西,但在 bind() 第一个参数的地方你不需要使用成员函数吗?

class X {
    bool f1(int);
    bool f2(int);
};

X x;
function<bool(int)> f = bind(&X::f1, &x);

【讨论】:

  • 嗯,只是查看了绑定的文档,......但我不完全理解它的作用。但是看看你的例子,我可以说当我调用f 时的结果就像调用了x.f1 一样吗?所以我可以得到x的对象属性?
  • 我试过bind(&amp;QueryEvaluatorPrivate::hasVarsUsed, this),但VS抱怨C2825: '_Fty': must be a class or namespace when followed by '::'
  • 我已经编辑了我的函数,看起来像:pastie.org/7169474 它的工作原理似乎有很多重复的代码,lambda 语法和返回的东西......有兴趣知道绑定有什么问题也。我以前关于绑定的 cmets 是否正确?它似乎不适用于this
  • 你猜对了,f(42) 应该调用 x.f1(42)。函数 X::f1 有两个参数,隐含的“this”和整数。绑定调用将第一个参数设置为 &x,至少语法正确:stackoverflow.com/questions/5154116/…。希望对您有所帮助。
【解决方案2】:

这是一个如何在 C++11 中使用 lambda 的示例:

#include <cassert>
#include <functional>
#include <iostream>

struct Class1 {
};

struct Class2 {
};

bool func1(int,Class1)
{
  return true;
}

bool func2(int,Class2)
{
  return false;
}

inline std::function<bool(int)> getFunc(Class1 obj1)
{
  return [=](int x){ return func1(x,obj1); };
}

inline std::function<bool(int)> getFunc(Class2 obj2)
{
  return [=](int x){ return func2(x,obj2); };
}

int main(int,char**)
{
  Class1 obj1;
  std::function<bool(int)> f1 = getFunc(obj1);
  Class2 obj2;
  std::function<bool(int)> f2 = getFunc(obj2);
  assert(f1(0)==true);
  assert(f2(0)==false);
  return 0;
}

【讨论】:

    猜你喜欢
    • 2012-06-17
    • 2020-01-12
    • 1970-01-01
    • 2021-12-08
    • 2021-10-13
    • 2011-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多