2014-11-25 111 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