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