我正在尝试使用可链操作符(类似于JQuery)编写类,而不是返回void,该函数返回它被调用的对象/指针,因此您可以对其执行更多功能。例如:
Foo* Foo::bar(Bar value){
_bar = value;
return this;
}
显然,最简单的方法是使用对象自己的类作为返回类型,如上所述,但我想知道是否有办法使用宏来缩短它。例如:
self Foo::bar(Bar value){
_bar = value;
}
宏基本上会用方法所属的类替换自己并添加“return this;”到最后。这可能吗?如果是这样,这是一个好主意,还是应该坚持通常的方法?
答案 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 ++形式。
但我想我质疑强迫消费者使用函数的价值,当没有任何逻辑时,只是直接暴露覆盖成员变量的能力。