首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如果定义了枚举常量,如何静态断言?

如果定义了枚举常量,如何静态断言?
EN

Stack Overflow用户
提问于 2020-06-15 10:05:23
回答 2查看 121关注 0票数 8

我有这个C++14代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <type_traits>

struct f1 {
    enum struct e { a };
};

struct f2 {
    enum struct e {};
};

template <typename T>
struct my_struct {
    using e = typename T::e;
    my_struct()
    : _e{e::a} {} // e::a used here
    e _e;
};

int main() {
    my_struct<f1> a;
    my_struct<f2> b; // compilation fails
}

显然,编译会失败,出现类似于'a' is not a member of 'my_struct<f2>::e'的错误。我真的很想在my_struct中添加一些静态断言,以添加自定义错误消息。首先,我可以检查e是否实际上是一个枚举:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static_assert(std::is_enum<e>::value, "my message");

那么,我应该添加什么来静态断言定义了e::a

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-06-15 11:36:33

与检测任何嵌套声明的方式相同:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <typename T, typename = void>
struct enum_defines_a : std::false_type {};

template <typename T>
struct enum_defines_a<T, decltype(void(T::a))> : std::is_enum<T> {};

static_assert(enum_defines_a<e>::value, "Enum doesn't define 'a'");
票数 3
EN

Stack Overflow用户

发布于 2020-06-15 11:52:53

您可以使用SFINAE来解决此问题。考虑以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
template <class T>
class has_a
{
    template <class C>
    static std::true_type test(C, C = C::a);

    template <class C>
    static std::false_type test(...);

public:
    using type = T;
    static bool constexpr value = decltype(test<T>(T{}))::value;
};

然后,您只需:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static_assert(has_a<e>::value, "Given type is incorrect.");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62385878

复制
相关文章
java枚举类型enum用法(java定义枚举常量类)
//自定义枚举类 class Season{ //1.声明Season对象的属性:private final修饰 private final String seasonName; private final String seasonDesc;
全栈程序员站长
2022/07/31
3.7K0
[Objective-C] 常量和枚举
#define宏定义 #define是一条预编译指令, 编译器在编译阶段前期会将所有使用到宏的地方简单地进行替换.
wOw
2018/09/18
5300
常量or枚举的取舍
例如这里org.springframework.http.HttpStatus.OK包含的至少有
阿超
2022/08/16
4260
常量or枚举的取舍
如何更好的定义枚举
枚举虽然是一个比较基础的东西。但如果你能在具体的开发中,更优雅的定义枚举的话会让你的代码看起来清新脱俗,本文将介绍枚举的各种用法,特别后面的通过构造函数传参以后,让你在开发中,遇到枚举与int value之间切换时变得更优雅。 用法一:常量 在JDK1.5 之前,我们定义常量都是: public static fianl.... 。现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法。 public enum Color { RED, GREEN, BLANK,
ImportSource
2018/04/03
1.1K0
常量接口 vs 常量类 vs 枚举区别
程序员 NEO
2023/10/12
1960
Java中怎样由枚举常量的ordinal值获得枚举常量对象
Java1.5提供了关键字enum,能够通过该关键字方便得定义自己须要的枚举类型,比方
全栈程序员站长
2022/07/14
1.8K0
硬编码,常量,枚举类
假如有一笔业务需要审核,审核状态分:未审核,审核中,审核通过,审核不通过。我们在程序里是否可以直接这么写: if(state==1){//1代表未操作 //操作 }else{ //...... } 将状态标识直接写在代码里面(硬编码),只图一时方便,却是后患无穷,如果有一天你需要修改状态标识,用0代表未审核而不是1,你不得不将所有与该标识相关的代码都找出来一个个改,另外,在编码过程中,标识输入错误的概率是比较高的,一不小心把0输入成了10,虽然不会提示任何编译错误,但运行结果将
java达人
2018/01/31
1.7K0
thinkphp如何自定义常量
在项目文件夹(如:Home)中的Common文件夹下新建common.php 加入如下语句:
PM吃瓜
2019/08/12
2K0
是枚举?还是常量?其实很好选择!
2、枚举实现了Comparable及Serializable接口,因此可以进行比较及序列化等操作,类型定义如下:
WindWant
2020/09/10
2.4K0
Go 常量定义
定义常量在各个语言中都是不可或缺的语法了. 而有些语言在常量的基础上, 增加了枚举类型, 比如C.
烟草的香味
2021/06/29
7770
什么是枚举和定义枚举
  有的时候一个类的对象是有限且固定的,这种情况下我们使用枚举类就比较方便?
MonroeCode
2018/01/11
1.5K0
Java常量池(静态常量池与运行时常量池)[通俗易懂]
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说Java常量池(静态常量池与运行时常量池)[通俗易懂],希望能够帮助大家进步!!!
Java架构师必看
2022/09/23
2.5K0
c++常量,c++常量定义
高久峰
2023/06/27
1320
EasyC++62,类常量和类枚举
比如说我们在类当中定义一个数组,希望可以定义一个常量,用来初始化数组的长度。既然是用来初始化数组长度的,那么这个值自然也不会改变,我们定义成const是否可行呢?比如这样:
TechFlow-承志
2022/08/26
2960
EasyC++62,类常量和类枚举
TypeScript-运行时和常量枚举
🌊 关注我不迷路,如果本篇文章对你有所帮助,或者你有什么疑问,欢迎在评论区留言,我一般看到都会回复的。大家点赞支持一下哟~ 💗
杨不易呀
2023/09/28
1940
java常量的定义
在Java语言中,主要是利用final关键字来定义常量。当常量被设定后,一般情况下就不允许再进行更改。如可以利用如下的形式来定义一个常量:final double PI=3.1315。在定义这个常量时,需要注意如下内容:
全栈程序员站长
2022/09/08
9110
thymeleaf全局常量定义
目测应该是重写这货就可以了,talk is cheap,show me the code
小尘哥
2018/08/15
1.5K0
js中如何定义一个”枚举”类型
Javascript1.8.5开始可以使用Object.freeze来冻结对象实现一个类似”枚举”类型。
IT工作者
2022/01/25
2.6K0
js中如何定义一个”枚举”类型
Javascript1.8.5开始可以使用Object.freeze来冻结对象实现一个类似”枚举”类型。
用户1349575
2021/12/28
2.4K0
点击加载更多

相似问题

Java枚举与静态常量

92

静态断言检查静态常量类数据成员?

11

静态断言枚举是某种基础类型。

10

如何静态地断言枚举元素的值?

56

循环通过常量枚举#定义

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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