如何使用C预处理自动生成以下代码模式(访问器)?
// Immutable accessor.
const auto& member1 () const {
return _member1; // private class member
}
// Mutable accessor.
auto& member1() {
return _member1; // private class member
}
我尝试了以下操作,但没有成功...
#define EXPAND_ACCESSOR(item) constexpr const auto& ##item() const { return _##item; } \
constexpr auto& ##item() { return _##item; }
EXPAND_ACCESSOR(member1) // didn't work
您可以使用宏来完成您要尝试的操作。您的宏需要一些调整。(我使用三行内容来回答问题)
你有:
#define EXPAND_ACCESSOR(item) \
constexpr const auto& ##item() const { return _##item; } \
constexpr auto& ##item() { return _##item; }
宏问题:
constexpr const auto& ##item() const { return _##item; } \
^^ Not appropriate.
我从g ++收到以下错误:
error: pasting "&" and "member1" does not give a valid preprocessing token
您只需要使用:
#define EXPAND_ACCESSOR(item) \
constexpr const auto& item() const { return _##item; } \
constexpr auto& item() { return _##item; }
这样可以解决预处理器错误,但会导致与返回类型相关的错误。当您使用auto
返回类型时,您将需要使用尾随返回类型。
将其constexpr
与非const
成员函数一起使用是不合适的。当成员函数用限定时constexpr
,将其假定为const
成员函数。因此,您需要constexpr
从该功能中删除。
这是一个应该起作用的固定宏:
#define EXPAND_ACCESSOR(item) \
constexpr const decltype( _ ## item) & item() const { return _ ## item; } \
decltype( _ ## item) & item() { return _ ## item; }
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句