如何在C ++中循环使用多个函数?

时间:2013-11-15 21:28:20

标签: c++ function syntax

我似乎无法找到有关以下事情的任何相关信息。

假设您有一个包含多种方法的程序(例如,一组自定义测试)。

你怎么能基于类似下面的伪代码

来循环它们
for(int i= 0;  i < 10 ; i ++)
    {
        function(i)();

    }

这样它就会经历这个循环,因此启动方法function0,function1,function2,function3,function4,function5,function6,function7,functuin8,function9。

如果有方法也可以在C#或Java中执行此操作,那么也可以了解它们的信息。

4 个答案:

答案 0 :(得分:2)

您需要的语言功能称为“反射”,这是C ++没有的功能。您需要明确命名要调用的函数。

答案 1 :(得分:2)

在C ++中,我能想到的唯一方法是使用函数指针数组。见here。 对于支持Reflection的Java,请参阅this。对于C#,它也支持Reflection,this

答案 2 :(得分:1)

好吧,如果你有一个函数指针数组,你可以这样做:

void (*myStuff[256])(void);

然后当你想要调用每个函数时,只需在迭代时取消引用每个函数。

请记住,数组中的每个函数都必须具有相同的参数签名和返回类型。

答案 3 :(得分:0)

这是一个使用Boost.FunctionBoost.Bind的解决方案,其中循环不需要担心您调用的函数的参数签名(我没有在编译器中测试它,但是我在一个项目中有非常相似的代码,我知道有效):

#include <vector>
#include <boost/function.hpp>
#include <boost/bind.hpp>

using std::vector;
using boost::function;
using boost::bind;

void foo (int a);
void bar (double a);
void baz (int a, double b);

int main()
{
   // Transform the functions so that they all have the same signature,
   // (with pre-determined arguments), and add them to a vector:
   vector<function<void()>> myFunctions;
   myFunctions.push_back(bind(&foo, 1));
   myFunctions.push_back(bind(&bar, 2.0));
   myFunctions.push_back(bind(&baz, 1, 2.0));

   // Call the functions in a loop:
   vector<function<void()>>::iterator it = myFunctions.begin();
   while (it != myFunctions.end())
   {
       (*it)();
      it++;
   }

   return 0;
}

请注意,如果编译器支持C ++ 11,则可以更轻松地完成循环:

   // Call the functions in a loop:
   for (const auto& f : myFunctions)
   {
      f();
   }

Boost.Bind还支持动态传递某些参数,而不是将它们绑定到预定值。有关详细信息,请参阅文档。您还可以通过将void替换为返回类型并更改循环以使用返回值执行某些操作来轻松地更改上面的代码以支持返回值(如果它们属于同一类型)。