Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在现代C++中重写此宏?

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

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

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

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

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
运行
AI代码解释
复制
#define APOT_ALIGNED(Type) alignas(NextPow2(sizeof(Type))) Type

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

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

https://stackoverflow.com/questions/55155745

复制
相关文章
如何在C中定义多行宏定义?
请参阅下面的示例,其中我将交换两个变量的值。 do-while(0)结构很不错 #include <stdio.h> #define swap(x,y,T) do { \ T temp = (*x);\ (*x) = (*y); \ (*y) = temp; \ } while (0) int main(void) { int a = 5; int b = 9; printf("Value of a and b before swaping\n"
用户4645519
2020/09/08
2.6K0
如何在C中定义多行宏定义?
如何在 ASP.NET Core 中重写 URL
所谓URL重写指的是更改当前执行的URL,将其指向另外的URL以继续处理当前请求或重定向到外部URL。在ASP.NET中我们可以使用HttpContext.RewritePath方法,但在.NET Core中它并不存在。下面我我们将学习重写和重定向之间的区别,和何时以及如何在ASP.NET Core 中使用它们。 实际开发中,常见的重写URL场景有如下四种:
喵叔
2021/12/05
3.2K0
C++宏定义 | 宏定义求面积
学过C语言的读者,对宏定义应该不陌生,同样在C++中,也可以用宏定义命令将一个指定的标识符来代表一个字符串,宏定义的作用一般是用一个短的名字代表一个长的字符串。
小林C语言
2020/12/01
1.7K0
C++宏定义 | 宏定义求面积
C++中重载、重写(覆盖)的区别实例分析
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_35512245/article/details/54773552
大黄大黄大黄
2018/09/14
6340
C++内置宏定义
标准内置宏定义是由相关的语言标准定义的,因此对于实现了这些语言标准的编译器来说都是可使用的。
hotarugali
2022/03/08
2K0
浅析“威胁猎人”如何在现代安全环境中运作
每年,互联网上都会出现数百万种新型恶意软件,威胁猎人必须随时候命,将识别和打击恶意软件列为优先事项,以确保组织能够保持安全,并且免受各种网络威胁的侵害。
FB客服
2018/07/30
5330
浅析“威胁猎人”如何在现代安全环境中运作
C++宏和枚举
我们的计算器程序,用1234对应加减乘除,对于人阅读很产生一点障碍。隔一个月后再看此代码可能想不起是0123还是1234了,还得去代码中查找,如果能为代表四则运算的四个数取个有意义的别名就好了,一看是知道对应什么。没问题,用宏啊。以下是我们的计算器程序第五版:
全栈程序员站长
2022/07/15
3370
C++中函数重载、隐藏、覆盖和重写的区别
C++规定在同一作用域中,同名函数的形式参数(指参数的个数、类型或者顺序)不同时,构成函数重载。
恋喵大鲤鱼
2018/08/03
8.4K1
现代c++中实现精确延时方法总结
这种非常不建议用,懒人做法。不够精确且换种环境系统处理速度不一样可能就是bug来源。
杨永贞
2022/11/21
3.6K0
现代c++中实现精确延时方法总结
现代C++之ADL
Koenig查找或参数依赖查找描述了C ++编译器如何查找不合格的名称 。简单来说:如果在函数的名称空间中定义了一种或多种参数类型,则不必为函数限定名称空间。
公众号guangcity
2020/01/14
1.6K0
现代C++之容器
本节将深入学习现代C++实战30讲中的第4节与第5节容器所提到的内容。正文中的一些文字直接引用自上面。
公众号guangcity
2019/12/30
1K0
现代C++之constexpr
(1)C++11中的constexpr指定的函数返回值和参数必须要保证是字面值,而且必须只有一行return代码,这给函数的设计者带来了更多的限制,比如通常只能通过return 三目运算符+递归来计算返回的字面值。
公众号guangcity
2020/02/13
1.2K0
现代C++之SFINAE
介绍c++的SFINAE概念:类成员的编译时内省 0.导语1.C++自省?2.老式的C++98方式2.1重载决议2.2 SFINAE2.3 sizeof运算符2.4 结合一切2.5 实现我们的想法2.
公众号guangcity
2020/02/13
3K0
现代C++之SFINAE
现代C++实现多种print
学习C++的朋友会遇到这样的问题,有char,int,double等对象,我们想把它们打印出来看看,初学者会通过cout或者传统C语言的printf函数来打印这些对象。
努力努力再努力F
2019/09/06
7870
现代 C++ 教程:高速上手 C++ 11/14/17/20
其中文书籍在线阅读网址为:现代 C++ 教程:高速上手 C++ 11/14/17/20,其中文PDF下载地址为:中文PDF下载 英文在线阅读网址为: Modern C++ Tutorial: C++ 11/14/17/20 On the Fly,英文书籍PDF下载地址为:PDF Download
ccf19881030
2021/01/14
1.6K0
现代 C++:自动类型推导
现代的编程语言,不管是动态语言(JavaScript、Python 等),还是静态语言(Go、Rust 等),大都支持自动类型推导(type deduction)。
linjinhe
2020/06/02
1.7K0
Java中的宏变量,宏替换详解。
群友在微信群讨论的一个话题,有点意思,特拿出来分享一下。 输出true false 来看下面这段程序,和群友分享的大致一样。 public static void main(String[] args
Java技术栈
2018/03/30
3.8K0
Java中的宏变量,宏替换详解。
C++ 宏定义与inline函数
如果 函数执行时间 小于 函数调用(参数压栈,栈帧开辟与回收,结果返回),那使用宏或者inline能减少函数执行时间。
村子里的设计师
2023/03/28
4510
C++之函数重载,重写,重定义
重载和重定义 函数重载是指函数名相同,但是参数不同的函数之间的关系。函数重载发生在同一个类内。 派生类和父类同名但不同参的函数之间不是重载关系,它们之间的关系是重定义。 重写 重写有个首要条件,那就是必须是基类的函数是虚函数,子类才能叫做重写父类的虚函数。 下面给段代码来说明一下. #include<iostream> using std::cout; using std::endl; class Parent { public: void fun1() { cout << "fun1()" <
zy010101
2020/04/08
1K0
C++之函数重载,重写,重定义
点击加载更多

相似问题

如何用模板宏重写此宏?

15

用现代C++取代宏

14

用现代c++技术替代c++宏的级联

10

此子宏能重写为函数吗?

13

c++中预处理宏重写函数定义

31
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文