2014-11-25 62 views
3

我有一組稱爲一個共同的接口函數,我存儲在一個共同的容器的函數指針,所以我有的#define函數參數C++

typedef void(*CommandFunction)(const InputArgsMap &, const ArgumentMap *); 

與此說,什麼是最好的方法聲明這種類型的函數而不復制粘貼參數列表?我想通過#define來實現,但是有沒有其他的(更好的,OOP)的方式?

例如,是否有可能像做

#define CMD_ARGS (const InputArgsMap &, const ArgumentMap *) 
void _fcn_1(CMD_ARGS); 
void _fnc_2(CMD_ARGS); 
+0

試試吧!運行預處理器並查看它輸出的內容。 – 2014-11-25 11:46:49

+0

@JoachimPileborg:這會告訴你,你不能這樣做。它不會告訴你這樣的事情是否可行。 – 2014-11-25 11:49:07

+1

謝謝你的答案:)它的工作原理,我必須刪除'#define'指令中的'()'。 – manatttta 2014-11-25 12:04:29

回答

5

如果你聲明一個函數,而不是指針,類型別名

typedef void CommandFunction(const InputArgsMap &, const ArgumentMap *); 

,那麼你可以用它來聲明函數

CommandFunction _fcn_1; 
CommandFunction _fcn_2; 

定義它們時,仍然需要寫出參數列表。

有沒有其他的(更好的,oop)的方式?

重寫抽象接口的虛擬成員函數可能會更好,具體取決於你在做什麼。如果你這樣做,你將不得不復制參數列表,你似乎覺得不愉快;但在現代C++中,您至少可以使用override說明符來確保您得到正確的結果。

+0

甚至是'CommandFunction _fcn_1,_fcn_2,_fcn_3,...;' – hvd 2014-11-25 11:47:57

+0

謝謝!它有效地提高了我的語法。我想將函數指針存儲在容器中,這就是爲什麼我直接定義爲指針的原因。但是,我也想簡化函數聲明,即'_fcn_1(args)',如果可能的話。 – manatttta 2014-11-25 12:07:49

+1

@manatttta:您仍然可以編寫'CommandFunction *'來獲取函數指針。至於'args',你仍然需要所有類型和名稱。爲了避免這種情況,你需要一個宏#define ARGS(a1,a2)InputArgsMap const&a1,ArgumentMap const * a2' – MSalters 2014-11-25 12:12:32