你能用宏来制作一个“自我”的返回类型吗?

时间:2015-09-07 22:31:13

标签: c++ macros

我正在尝试使用可链操作符(类似于JQuery)编写类,而不是返回void,该函数返回它被调用的对象/指针,因此您可以对其执行更多功能。例如:

Foo* Foo::bar(Bar value){
    _bar = value;
    return this;
}

显然,最简单的方法是使用对象自己的类作为返回类型,如上所述,但我想知道是否有办法使用宏来缩短它。例如:

self Foo::bar(Bar value){
    _bar = value;
}

宏基本上会用方法所属的类替换自己并添加“return this;”到最后。这可能吗?如果是这样,这是一个好主意,还是应该坚持通常的方法?

2 个答案:

答案 0 :(得分:4)

我认为你担心小事情。在项目的整个生命周期中,写入时间的差异

Foo* Foo::bar(Bar value){
    _bar = value;
    return this;
}

VS

self Foo::bar(Bar value){
    _bar = value;
}

太小了,甚至不值得讨论。如果考虑到第二个代码块中可读性的损失,我会说第二种方法会比第一种方法花费更多。不仅如此,您还必须提出两个宏 - 一个用于const个成员函数,另一个用于非const成员函数。

顺便说一下,我建议使用Foo&作为返回时间。

Foo& Foo::bar(Bar value){
    _bar = value;
    return *this;
}

仅当函数有可能返回NULL以表示失败时,才返回指针。

答案 1 :(得分:0)

我不推荐它,但可以使用类似的方法:

#define self(T,memname,arglist) T* T::memname arglist { memname##impl REMOVETYPES(arglist); return this; } void T::memname##impl arglist

self(Foo,bar,(Bar value))
{
    this.internal_bar = value;
}

请注意,这看起来不再像成员声明。如果你要朝这个方向发展,不妨为可连接的制定者制作一个宏:

#define DEFINE_SETTER(T,setterName,MemType,MemName) T* T::setterName(MemType value) { MemName = value; return this; }

DEFINE_SETTER(Foo,setBar,Bar,bar)

后一个版本至少显然是一个基于宏的代码生成器,而不是假装是一个奇怪的真实C ++形式。

但我想我质疑强迫消费者使用函数的价值,当没有任何逻辑时,只是直接暴露覆盖成员变量的能力。