首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在现代C++中重写此宏?

如何在现代C++中重写此宏?
EN

Stack Overflow用户
提问于 2019-03-14 13:49:24
回答 1查看 100关注 0票数 1

我们的C++17代码库中有一个宏,它说:

代码语言:javascript
代码运行次数:0
运行
复制
#define APOT_DEF(Type, Member) alignas(NextPow2(sizeof(Type))) Type Member

有没有可能在不使用宏的情况下在现代C++中实现相同的功能?

一个函数或者一个函数和一个类型的组合能够做到这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-14 15:30:09

它不能被完美地替换。问题是alignas属性只能应用于两个地方。到(成员) varaible的声明,或者到类类型的声明。因此,一个潜在的替代品可能是这样的:

代码语言:javascript
代码运行次数:0
运行
复制
template<typename Type>
struct alignas (NextPow2(sizeof(Type))) ApotDef {
    Type mem;
    operator Type& () & { return mem; }
    operator Type const& () const& { return mem; }
    operator Type&& () && { return std::move(mem); }
    // Maybe for volatile?
};

因此,APOT_DEF(Type, Member)的每一次出现都可能被ApotDef<Type> Member;所取代。这将允许在Type本身可以使用的许多相同的地方使用ApotDef<Type>,但这不是一滴替代品。会有一些实例(大多数涉及类型演绎)不会触发到Type glvalue的转换。

因此,如果确切的成员类型对您很重要,我将坚持使用宏。不过,我会稍微修改一下,使声明更像是" C++“,而不是包装C++的DSL。我会使用这个宏:

代码语言:javascript
代码运行次数:0
运行
复制
#define APOT_ALIGNED(Type) alignas(NextPow2(sizeof(Type))) Type

所以变量声明至少要有声明的形式:

代码语言:javascript
代码运行次数:0
运行
复制
APOT_ALIGNED(Type) member;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55155745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档