是否可以在没有预处理器宏的情况下为"virtual" get-setter 定义默认实现



可以使用模板默认实现getter-setter。

例如——http://www.kirit.com/C%2B%2B%20killed%20the%20get%20%26%20set%20accessors/A%20simple%20meta-访问者。最重要的是,如果您决定覆盖这种setter或getter的默认行为,您可以轻松地做到这一点,而无需更改"客户端"代码,因为setter getter调用语法与调用方法相同,即:

an_object.an_int( 3 );
int i = an_object.an_int();

在这两种情况下,an_int都可以是带运算符()的对象或an_object的方法。重写后,将需要在"客户端"代码中重新编译。

但是,在没有预处理器宏的情况下,有可能为getter-setter定义"虚拟"默认实现吗?也就是说,这里重要的是,在过度编译期间不需要重新编译"客户端"代码。当然,这可能与预处理器有关,我想知道,还有什么更优雅的解决方案吗?

就我所知,C++03是不可能的,但也许有人有一些想法,或者它在C++11中是可能的?


回答"David Rodríguez-dribeas":像这样的东西:

#define accessor(type,name) 
virtual type name() {return m_##name;} 
type m_##name;

它可以在派生类中被重写,而无需重新编译"客户端"代码。

只要函数不是内联的,如果重新实现函数,就不需要重新编译客户端代码。您只需要用新的实现重新链接客户端代码。

不是以一种通常有用的方式。它可能几乎适用于非常特定的用例。然而,支持这些一次性产品的维护负担很少值得付出努力。

要做到这一点,你需要将大量的复杂性降低到你正在写的"字段"类型中。这种复杂性不能很好地概括。这将是一个巨大的混乱,使用起来并不比自己编写访问者更容易。

如果编写这些访问器很耗时,请编写免费的助手函数以使其更容易。这些自由函数是具体而直接的,因为它们只做一件事。随着时间的推移,以这种方式收集行为更加灵活和可维护,即使它被认为有点冗长。

这也有更好的封装。实际上,您正在向界面中倾倒大量的实现细节,这些细节并不有趣,也不应该存在。

相关内容

最新更新