如何使用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
答案 0 :(得分:1)
您可以使用宏来完成您正在尝试的内容。你的宏需要一些调整。 (我使用三行来帮助解答)
你有:
#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; }
修复了proprocessor错误但会导致与返回类型相关的错误。如果在返回类型中有auto
,则需要使用尾随返回类型。
将constexpr
与非const
成员函数一起使用是不合适的。当成员函数使用constexpr
限定时,假定它是const
成员函数。因此,您需要从该函数中删除constexpr
。
这是一个应该有效的固定宏:
#define EXPAND_ACCESSOR(item) \
constexpr const decltype( _ ## item) & item() const { return _ ## item; } \
decltype( _ ## item) & item() { return _ ## item; }
答案 1 :(得分:-2)
typedef 语法:
typedef struct Books {
char title[50];
char author[50];
char subject[100];
int book_id;
} Book;
之前将'Book'替换为整个struct定义。 ;在{}内有效。