【发布时间】:2015-01-22 11:01:04
【问题描述】:
我想知道预处理器逻辑/宏魔术是否可以让人们在 C(11) 中像在典型的 OO 语言中那样做,即
instance->method(a, b)
或
instance.method(a, b)
而不是
method(instance, a, b) //instance is 'this'
?
确实这只是一个排序问题,但我很想知道是否有人使用宏实现了类似的单词排序。我更喜欢不必在每个方法调用的客户端代码中将this 作为显式参数传递的想法。因此问题。
【问题讨论】:
-
当然 - 您可以将函数指针放在结构中。不需要宏。
-
@PaulR 但是您仍然必须明确传递
this。这是我试图避免的。用这个事实更新了问题。 -
@PaulR:是的,但是你必须调用
obj->funct(obj, a, b),它有一个多余的obj。 -
好的 - 是的 - 我想你可以用一个宏来隐藏它,但那时事情开始变得丑陋了。
-
我会直言不讳 - 不,没有预处理器魔法可以做到这一点。 1.函数必须传递一个指向实例的指针。 2. 要将宏扩展为您想要的(
instance->method(instance, a, b)),它至少需要了解方法、实例和参数。这些必须通过宏参数提供,因为宏不能读取或删除相邻的文本,例如,instance->MACRO(a, b)。因此,最低限度是MACRO(instance, a, b)。但是,由于instance被扩展了两次,您的宏可能会做非法的事情:MACRO(ptr++, a, b)变为(ptr++)->method((ptr++), (a), (b))。
标签: c c-preprocessor preprocessor-directive