是否可以在没有预处理器宏的情况下为getter-setter定义“虚拟”默认实现

时间:2012-03-14 18:36:38

标签: c++ templates virtual getter-setter auto

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

例如 - http://www.kirit.com/C%2B%2B%20killed%20the%20get%20%26%20set%20accessors/A%20simple%20meta-accessor。 最重要的是,如果您决定覆盖此类setter或getter的默认行为,您可以轻松地执行此操作而无需更改“客户端”代码,因为setter-getter调用语法与调用方法相同,即:

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

在这两种情况下,an_int可以是带有operator()的对象或an_object的方法。在覆盖重新编译后,将需要“客户端”代码。

但是没有预处理器宏可以为getter-setter定义“虚拟”默认实现吗?这里重要的是,在重复编译“客户端”代码时不需要。当然,我可以使用预处理器,我想知道,还有更优雅的解决方案吗?

对于我对C ++ 03的了解是不可能的,但也许某人有一些想法,或者可能在C ++ 11中有可能?


回答“DavidRodríguez - dribeas”: 像这样的东西:

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

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

不是一般有用的方式。它可能几乎适用于非常具体的用例。支持这些一次性的维护负担很少值得努力。

要做到这一点,你要将很多复杂性压缩到你正在编写的这个“字段”类型中。这种复杂性不会很好地概括。这将是一个巨大的混乱,并不比仅自己编写访问器更容易使用。

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

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