我得到了一些变量依赖于不同功能的对象。换句话说:对象中的变量依赖于多种类型的函数,但应该有多个对象具有相同的这些函数。为了更多的清关,我试图给出一个例子(这不起作用)。
#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;
}
这当然是一个极小的例子。变量大小取决于某个函数,该函数应该作为参数传递给类。想象fun1
和fun2
作为不同种类的随机数生成器。
我认为C ++中的思维方式是一个包含变量的类,从中继承的类被不同对象的函数修改(如果我对这个假设有误,请纠正我)。但我的问题是:
是否有可能实现某种高阶构造函数?如果是这样,一个例子会很好。
p.s。:如果我使用了一些错误的技术术语,我很乐意纠正。
答案 0 :(得分:5)
更改为:
A( double (*f)() )
{
size = f();
};
和
A a = A( fun1 );
当你传递试图调用该函数的&fun1()
然后获取其结果的地址时。你真正想要的是函数指针本身,它存储在fun1
。
答案 1 :(得分: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;
}
答案 2 :(得分: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;
}
答案 3 :(得分: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())。有几种方法可以获得这样的对象: