我得到了一些变量依赖不同功能的对象。用不同的单词来说:有多种类型的函数,对象中的变量依赖于这些函数,但是应该有多个对象具有相同的这些函数。有关更多许可,我试图举一个示例(该示例不起作用)。

#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:如果我错误地使用了一些技术术语,我很高兴得到纠正。

有帮助吗?

解决方案

改成:

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

和:

A a = A( fun1 );

当你过去 &fun1() 那是试图调用该功能,然后获取其结果的地址。您实际想要的是函数指针本身,它存储在 fun1.

其他提示

此示例毫无意义,因为您没有保存函数指针以供以后使用。您可以简单地将其重写

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;
}

我建议编写模板,以便您可以传递任何功能指针或功能对象。这使编译器可以更轻松地进行优化,例如在许多情况下插入,并且更灵活。获取功能指针时,您也不应使用括号。

#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;
}

看来您只需要传递功能本身。你几乎得到了。这是正确的语法:

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 ++中的一流对象,因此创建具有某些变量的闭合的唯一方法(例如,如果要携带该函数或调用非静态成员函数)是函数(具有Overloaded Operator()的对象() )。有几种获取此类对象的方法:

  1. 独自定义它,将所有必要的变量存储在字段中,然后将其作为函数的参数传递。
  2. 使用C ++ 11的Lambda功能和STD ::功能
  3. 使用boost ::函数和boost :: bind。
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top