我不确定以下是否可行。有人可以给出这个要求的等价物吗?
if(dimension==2)
function = function2D();
else if(dimension==3)
function = function3D();
for(....) {
function();
}
我不确定以下是否可行。有人可以给出这个要求的等价物吗?
if(dimension==2)
function = function2D();
else if(dimension==3)
function = function3D();
for(....) {
function();
}
这是可能的,假设有两件事:
function2D()
具有function3D()
相同的签名和返回类型。function
是一个函数指针,与 和 具有相同的返回类型和function2D
参数function3D
。您正在探索的技术与构建跳转表所使用的技术非常相似。您有一个函数指针,您可以根据运行时条件在运行时分配(并调用)它。
这是一个例子:
int function2D()
{
// ...
}
int function3D()
{
// ...
}
int main()
{
int (*function)(); // Declaration of a pointer named 'function', which is a function pointer. The pointer points to a function returning an 'int' and takes no parameters.
// ...
if(dimension==2)
function = function2D; // note no parens here. We want the address of the function -- not to call the function
else if(dimension==3)
function = function3D;
for (...)
{
function();
}
}
您可以使用函数指针。
这里有一个教程,但基本上你所做的就是像这样声明它:
void (*foo)(int);
其中函数有一个整数参数。
然后你这样称呼它:
void my_int_func(int x)
{
printf( "%d\n", x );
}
int main()
{
void (*foo)(int);
foo = &my_int_func;
/* call my_int_func (note that you do not need to write (*foo)(2) ) */
foo( 2 );
/* but if you want to, you may */
(*foo)( 2 );
return 0;
}
因此,只要您的函数具有相同数量和类型的参数,您就应该能够做您想做的事情。
由于这也被标记为 C++,std::function
如果您有权访问C++11
,或者std::tr1::function
您的编译器支持 C++98/03 和 TR1,则可以使用。
int function2d();
int function3D();
int main() {
std::function<int (void)> f; // replace this with the signature you require.
if (dimension == 2)
f = function2D;
else if (dimension == 3)
f = function3D;
int result = f(); // Call the function.
}
正如其他答案中提到的,确保您的函数具有相同的签名并且一切都会好起来的。
如果您的编译器不提供std::function
or std::tr1::function
,那么总会有boost library。
既然你选择了 C++
这是std::function
C++11 中的示例
#include <functional>
#include <iostream>
int function2D( void )
{
// ...
}
int function3D( void )
{
// ...
}
int main()
{
std::function<int(void)> fun = function2D;
fun();
}