2

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

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());

那(或类似的)可能吗?

提前致谢 :-)

4

5 回答 5

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));

否则,您将不得不准备一个界面以获取说明。

于 2012-12-06T12:55:30.087 回答
2

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

于 2012-12-06T12:54:24.080 回答
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 编译器。

于 2012-12-06T12:57:18.933 回答
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;
}
于 2012-12-06T13:43:43.127 回答
0

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

于 2012-12-06T13:01:55.507 回答