gpt4 book ai didi

C 预处理 Token 串联

转载 作者:行者123 更新时间:2023-11-30 18:12:28 25 4
gpt4 key购买 nike

如何使用 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; }

关于C 预处理 Token 串联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35737343/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com