2012-12-06 121 views
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());

是這樣(或類似的東西)可能嗎?

預先感謝:-)

回答

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

否則,你就必須準備一個接口的說明。

2

<instruction>參數可以是一個函數指針(即一個指向execute功能);或者,它可以是對具有execute方法的類實例的引用。

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編譯器。

+0

是但數量(和類型)的參數'param'可能會改變很多...它並不總是一個'int',它並不總是一個參數: -/ – Jav

+0

@Jav我更新了答案。 – jrok

0

您的參數也可以是一個基類指針,指向派生類具有一個虛擬函數

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