C++ 是否有可能定义“的含义?”;虚拟的;无预处理器宏的getter setter的默认实现

C++ 是否有可能定义“的含义?”;虚拟的;无预处理器宏的getter setter的默认实现,c++,templates,virtual,getter-setter,auto,C++,Templates,Virtual,Getter Setter,Auto,可以使用模板默认实现getter setter 例如-。 最重要的是,如果您决定覆盖此类setter或getter的默认行为,您可以轻松地做到这一点,而无需更改“客户机”代码,因为setter-getter调用语法与调用方法相同,即: an_object.an_int( 3 ); int i = an_object.an_int(); 在这两种情况下,\ int可以是带有运算符()的对象,也可以是\u对象的方法。重写后,需要在“客户端”代码中重新编译 但是,是否可以在没有预处理器宏的情况下为g

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

例如-。 最重要的是,如果您决定覆盖此类setter或getter的默认行为,您可以轻松地做到这一点,而无需更改“客户机”代码,因为setter-getter调用语法与调用方法相同,即:

an_object.an_int( 3 );
int i = an_object.an_int();
在这两种情况下,\ int可以是带有运算符()的对象,也可以是\u对象的方法。重写后,需要在“客户端”代码中重新编译

但是,是否可以在没有预处理器宏的情况下为getter setter定义“虚拟”默认实现?i、 这里重要的一点是,在overide重新编译“客户机”代码的过程中不需要。当然也可以使用预处理器,我想知道,还有更优雅的解决方案吗

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


“大卫·罗德里格斯-德里比斯”的答案: 大概是这样的:

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

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

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

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


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

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


这也有更好的封装。实际上,您正在将大量的实现细节转储到您的接口中,这些细节并不有趣,也不应该存在。

在绝大多数情况下,您可以编写一个真正的接口,而根本不编写访问器/变体。然后问题就消失了!我无法真正理解这个问题,我认为如果您提供了您心目中的预处理器宏解决方案,您可能会更好地理解“虚拟”默认实现的含义(我真的很想知道您如何在预处理器级别执行某些操作,而不需要重新编译客户端…)使用预处理器可以实现的任何对象都可以在没有它的情况下实现。Mark B,实际上我现在没有这个问题。这对我来说很有趣,如果技术上可行的话。我知道在很多情况下访问器是多余的。顺便说一句,在看了AJG85之后,我有这样的问题,我需要没有太多语法重复的默认实现。一个想法很明显。调用的相似语法并不意味着相似机制。例如,在运算符()的情况下,传递给函数的“this”将是指向一个\u int对象的指针,但在方法的情况下,传递给函数的“this”将是指向一个\u对象的指针。“要做到这一点,您将大量的复杂性压入您正在编写的“field”类型中”,我感觉您的意思是解决方案,“field”类型将具有虚拟方法。但请注意,如果没有“友元”规范,“字段”类型无法访问容器类的受保护/私有成员/数据