我想作为参数给出一条指令:
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());
这是(或类似的)可能吗?
提前致谢: - )
答案 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;
}