我想知道预处理器逻辑/宏魔法是否可以像C(11)那样在典型的OO语言中进行,即
instance->method(a, b)
或
instance.method(a, b)
而不是
method(instance, a, b) //instance is 'this'
实际上它只是一个订购问题,但我有兴趣知道是否有人使用宏实现了类似的单词排序。我更喜欢不必在每个方法调用的客户端代码中将this
作为显式参数传递的想法。因此问题。
答案 0 :(得分:3)
使用GCC,你可以像这样创建一个宏:
#define MCALL(obj, method, ...) do {\
typeof(obj) this;\
this->method(this, ## __VA_ARGS__);\
} while(0)
但是这使用typeof
这是一个GCC扩展。
它不用于参数,因为它使用GCC扩展的##
运算符。有关GCC如何实现可变参数宏的更多信息,请参阅this manual page。
当然,实际上做这样的事情可能是一个坏主意,因为你几乎重新设计了语言本身,从而使其他人更难理解。
答案 1 :(得分:3)
我完全可以看到做这样的事情只是为了好玩。但是我会小心在任何将被其他人使用或看到的代码中使用这种hackery。
"总是编码好像维护你的代码的人是一个疯狂的连环杀手知道你住在哪里"
努力使用您正在使用的语言的惯例。
所以要么坚持使用someFunc(obj, param1, param2);
,要么就可以切换到支持所需功能的语言。
答案 2 :(得分:1)
如果您不想使用“with params”和“no params”版本,并且您不介意源代码中不匹配的括号,您可以尝试:
#define MCALL( object, method ) object->method( object
并将其命名为:
MCALL( mything, setLength ), 57 ) ;
length = MCALL( mything, getLength ) ) ;
但那很难看。