稍后执行指令

时间:2012-12-06 12:50:17

标签: c++

我想作为参数给出一条指令:

execute_at_frame(int frame_number, <instruction>)
{
    for(f = 1 ; f < F_MAX ; f++)
    {
        /* other instructions */
        if (f == frame_number)
            /* execute <instruction> */
        /* other instructions */
    }
}
  • 一种电话:execute_at_frame(5,execute(42));
  • 另一种电话:execute_at_frame(6,process());

这是(或类似的)可能吗?

提前致谢: - )

5 个答案:

答案 0 :(得分:3)

是的,如果您使用std::bind(C ++ 11):

template <class F>
void execute_at_frame(int frame_number, F instruction)
{
    for(int f = 1 ; f < F_MAX ; f++)
    {
        /* other instructions */
        if (f == frame_number)
            instruction();
        /* other instructions */
    }
}

/* ... */

execute_at_frame(5,process); // no bind for functions without parameters
execute_at_frame(5,std::bind(execute,42));

否则,您必须准备一个界面以获取指示。

答案 1 :(得分:2)

您的<instruction>参数可以是函数指针(即指向execute函数的指针);或者,它可以是对类实例的引用,它具有execute方法。

答案 2 :(得分:1)

您可以传递一个函数指针以及(如果需要)一些参数。它看起来像这样:

typedef void (*Instruction)(int);

void foo(int)
{
    // do something
}

void execute_at_frame(int frame_number, Instruction ins, int param)
{
    for(int f = 1 ; f < F_MAX ; f++)
    {
        /* other instructions */
        if (f == frame_number)
            ins(param);
    }
}

样本用法:

execute_at_frame(1000, foo, 42);

如果使用可变参数模板,则可以使用任何签名。简化示例:

void foo(int)
{
}

float bar(int, char, double)
{
    return 1.0;
}

template<typename F, typename... Args>
void execute(F ins, Args... params)
{
    ins(params...);
}

int main()
{
    execute(foo, 1);
    execute(bar, 1, 'a', 42.0);
}

你需要C ++ 11编译器。

答案 3 :(得分:0)

您的参数也可以是基类指针,指向具有虚函数的Derived类

答案 4 :(得分:0)

使用函数作为参数的代码:

#include <functional>
#include <iostream>
using namespace std;

int instruction(int instruc)
{
     return instruc ;
}


template<typename F>
void execute_at_frame(int frame, const F& function_instruction)
{
     std::cout << function_instruction(frame) << '\n';
}


int main()
{
     execute_at_frame(20, instruction);  //  use reference
     execute_at_frame(40, &instruction); //  use pointer




  cout<<" \nPress any key to continue\n";
  cin.ignore();
  cin.get();

   return 0;
}