0

我得到了一些变量依赖于不同函数的对象。换句话说:对象中的变量所依赖的函数有多种类型,但应该有多个对象具有相同的函数。为了获得更多许可,我试图举一个例子(这不起作用)。

#include <iostream>

class A
{
  double size;

  A( double (*f)() )
  {
    size = (*f)();
  };
};

double fun1()
{
  return 42.0;
}


int main()
{
  A a = A( &fun1() );

  std::cout << a.size << std::endl;
}

这当然是一个最小的例子。变量大小取决于应作为参数传递给类的某个函数。想象一下fun1fun2作为不同种类的随机数生成器。

我认为 C++ 中的理念方式将是一个包含变量的类,并且从它继承的类由不同对象的函数修改(如果我对这个假设有误,请纠正我)。但我的问题是:

有没有可能实现某种高阶构造函数?如果是这样,一个例子会很好。

ps:如果我用错了一些技术术语,我很高兴得到纠正。

4

4 回答 4

5

改成:

A( double (*f)() )
{
    size = f();
};

和:

A a = A( fun1 );

当您传递时&fun1(),它试图调用该函数,然后获取其结果的地址。你真正想要的是函数指针本身,它存储在fun1.

于 2013-11-07T23:01:23.883 回答
1

这个例子没有意义,因为你没有保存函数指针供以后使用。您可以简单地将其重写为

class A
{
    double size;

    A(double sz) {
        size = sz;
    };
};

double fun1()
{
    return 42.0;
}


int main()
{
    A a = A(fun1());
    std::cout << a.size << std::endl;
}
于 2013-11-07T23:04:02.153 回答
1

我建议改为编写模板,以便您可以传入任何函数指针或函数对象。这允许编译器在许多情况下更轻松地进行内联等优化,并且更加灵活。获取函数指针时也不应使用括号。

#include <iostream>

class A {
public:
    template<typename F>
    explicit A(F&& f) : size(f()) {

    };

    double size;
};

double fun1() {
    return 42.0;
}

int main() {
    A a(&fun1);
    std::cout << a.size << std::endl;
}
于 2013-11-07T23:05:51.740 回答
0

看起来您只需要传递函数本身。你几乎明白了。这是正确的语法:

typedef double (*functype)();

void foo(functype f) {
    cout << f();
}

double bar() {
    return 2.39;
)

foo(bar); // don't call bar here, just pass it as address.

您还可以声明 foo 如下:

void foo(double (*f)());

函数不是 C++ 中的一等对象,因此创建带有一些变量的闭包的唯一方法(例如,如果要携带函数或调用非静态成员函数)是函子(具有重载 operator() 的对象)。有几种获取此类对象的方法:

  1. 自己定义它,将所有必要的变量存储在字段中并将其作为函数的参数传递。
  2. 使用 C++11 的 lambda 函数和 std::function
  3. 使用 boost::function 和 boost::bind。
于 2013-11-07T23:06:19.367 回答