- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在使用 C++ 时遇到了一些问题。我使用 GAlib 库构建应用程序(它是遗传算法组件的 C++ 库 - http://lancet.mit.edu/ga/)。
在其中一个示例(示例的完整代码:http://lancet.mit.edu/galib-2.4/examples/ex6.C)中,作者创建了初始化树的函数:
void TreeInitializer(GAGenome & c)
{
GATreeGenome<int> &child=(GATreeGenome<int> &)c;
// destroy any pre-existing tree
child.root();
child.destroy();
// Create a new tree with depth of 'depth' and each eldest node containing
// 'n' children (the other siblings have none).
int depth=2, n=2, count=0;
child.insert(count++,GATreeBASE::ROOT);
for(int i=0; i<depth; i++){
child.eldest();
child.insert(count++);
for(int j=0; j<n; j++)
child.insert(count++,GATreeBASE::AFTER);
}
}
他以这种方式调用函数:
genome.initializer(TreeInitializer);
而且他没有通过一个论点。例如,当我尝试通过更改声明将参数传递给该函数时:
void TreeInitializer(GAGenome &, int deph);
编译器显示错误。我不知道如何正确调用此功能。我知道它与引用有关,但以这种方式传递(或不传递)参数对我来说是新的。
如何向该函数传递更多参数?
最佳答案
行 genome.initializer(TreeInitializer);
没有调用 TreeInitializer
- 相反,它将指向该函数的指针传递给 genome.initializer
,所以它可以用它需要的任何参数调用它/多次。如果您希望 TreeInitializer
接受更多参数,您需要修改 initializer
以接受不同类型的函数。大概定义为
void initializer(void (*f)(GAGenome&))
{
// ...
f(genome);
// ...
}
您需要将参数类型更改为 void (*f)(GAGenome&, int)
并更改调用 f
的行。
另一方面,如果您不能修改初始化函数但希望能够指定深度,那么您能做的最好的事情就是创建一个全局变量,将其设置为您需要的任何深度并具有 TreeInitializer
使用该变量。如果您认为全局变量是邪恶的,这不是一个干净的解决方案,但如果 initializer
不允许您提供任何“上下文”,它是您唯一的选择。
关于c++ - 如何将参数传递给函数 - 处理引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20248354/
我是一名优秀的程序员,十分优秀!