C: 调用 class 方法而不显式传递 `this`?
C: Call class method without explicitly passing `this`?
我想知道预处理器逻辑/宏魔法是否可以让人们在 C(11) 中像在典型的 OO 语言中那样做,即
instance->method(a, b)
或
instance.method(a, b)
而不是
method(instance, a, b) //instance is 'this'
?
真的,这只是一个排序问题,但我很想知道是否有人使用宏实现了类似的词序。我更喜欢这样的想法,即不必在每次方法调用时都将 this
作为客户端代码中的显式参数传递。因此问题。
使用 GCC,您可以像这样创建一个宏:
#define MCALL(obj, method, ...) do {\
typeof(obj) this;\
this->method(this, ## __VA_ARGS__);\
} while(0)
但这使用了 typeof
,这是一个 GCC 扩展。
它将不使用任何参数,因为它使用 GCC 扩展的 ##
运算符。有关 GCC 如何实现可变参数宏的更多信息,请参阅 this manual page。
当然,实际上做这样的事情可能不是一个好主意,因为您几乎是在重新设计语言本身,从而使其他人更难理解。
我完全可以看到做这样的事情只是为了好玩。但我会小心避免在任何将被其他人使用或看到的代码中使用此类黑客技术。
"Always code as if the person who will maintain your code is a maniac serial killer knows where you live"
努力使用您正在使用的语言的约定。
因此,要么坚持使用 someFunc(obj, param1, param2);
,要么,如果可以,切换到支持您所需功能的语言。
如果您不想要 "with params" 和 "no params" 版本,并且您不介意源代码中的括号不匹配,您可以尝试:
#define MCALL( object, method ) object->method( object
并调用它:
MCALL( mything, setLength ), 57 ) ;
length = MCALL( mything, getLength ) ) ;
但这很丑。
我想知道预处理器逻辑/宏魔法是否可以让人们在 C(11) 中像在典型的 OO 语言中那样做,即
instance->method(a, b)
或
instance.method(a, b)
而不是
method(instance, a, b) //instance is 'this'
?
真的,这只是一个排序问题,但我很想知道是否有人使用宏实现了类似的词序。我更喜欢这样的想法,即不必在每次方法调用时都将 this
作为客户端代码中的显式参数传递。因此问题。
使用 GCC,您可以像这样创建一个宏:
#define MCALL(obj, method, ...) do {\
typeof(obj) this;\
this->method(this, ## __VA_ARGS__);\
} while(0)
但这使用了 typeof
,这是一个 GCC 扩展。
它将不使用任何参数,因为它使用 GCC 扩展的 ##
运算符。有关 GCC 如何实现可变参数宏的更多信息,请参阅 this manual page。
当然,实际上做这样的事情可能不是一个好主意,因为您几乎是在重新设计语言本身,从而使其他人更难理解。
我完全可以看到做这样的事情只是为了好玩。但我会小心避免在任何将被其他人使用或看到的代码中使用此类黑客技术。
"Always code as if the person who will maintain your code is a maniac serial killer knows where you live"
努力使用您正在使用的语言的约定。
因此,要么坚持使用 someFunc(obj, param1, param2);
,要么,如果可以,切换到支持您所需功能的语言。
如果您不想要 "with params" 和 "no params" 版本,并且您不介意源代码中的括号不匹配,您可以尝试:
#define MCALL( object, method ) object->method( object
并调用它:
MCALL( mything, setLength ), 57 ) ;
length = MCALL( mything, getLength ) ) ;
但这很丑。