首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何判断使用了哪个枚举模板参数,而不实际将该枚举存储在某个类属性中?

在C++中,如果你想判断使用了哪个枚举模板参数,但不实际将该枚举存储在某个类属性中,你可以利用模板特化和静态断言来实现。这种方法通常用于编译时检查枚举类型的使用情况。

以下是一个示例代码,展示了如何实现这一功能:

代码语言:txt
复制
#include <iostream>

// 定义一个基础模板
template <typename T>
struct EnumChecker {
    static_assert(sizeof(T) == 0, "Unsupported enum type");
};

// 特化模板,用于处理特定的枚举类型
template <>
struct EnumChecker<int> {
    static constexpr const char* name = "int";
};

template <>
struct EnumChecker<short> {
    static constexpr const char* name = "short";
};

// 示例枚举类型
enum class Color : int { Red, Green, Blue };
enum class Size : short { Small, Medium, Large };

int main() {
    // 使用静态断言来检查枚举类型
    std::cout << "Color enum type: " << EnumChecker<decltype(Color::Red)>::name << std::endl;
    std::cout << "Size enum type: " << EnumChecker<decltype(Size::Small)>::name << std::endl;

    return 0;
}

解释

  1. 基础模板EnumChecker 是一个基础模板,默认情况下会触发静态断言,表示不支持该枚举类型。
  2. 特化模板:针对特定的枚举类型(如 intshort),我们提供了特化模板,并定义了一个静态常量 name 来表示枚举类型的名称。
  3. 示例枚举类型:定义了两个示例枚举类型 ColorSize,分别基于 intshort
  4. 静态断言:在 main 函数中,我们使用 decltype 来获取枚举值的类型,并通过 EnumChecker 来检查该类型。如果类型不匹配,静态断言会触发编译错误。

优势

  • 编译时检查:这种方法在编译时进行类型检查,可以提前发现类型错误。
  • 无需存储:不需要将枚举值存储在类属性中,节省内存。
  • 灵活性:可以通过特化模板来处理不同的枚举类型。

应用场景

  • 模板元编程:在模板元编程中,需要在编译时确定枚举类型。
  • 类型检查:在不实际存储枚举值的情况下,进行类型检查和验证。

参考链接

通过这种方法,你可以在编译时判断使用了哪个枚举模板参数,而不实际将该枚举存储在某个类属性中。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Kotlin入门(15)独门秘笈之特殊

可是枚举类型实际上是一种,开发者代码创建enum类型时,编译器会自动生成一个对应的,并且该类继承自java.lang.Enum。...因此,Kotlin摒弃了“枚举类型”那种模糊不清的说法,转而采取“枚举”这种正本清源的提法。具体到编码上,则将enum作为关键字class的修饰符,使之名正言顺地成为一个——枚举。...那么如果某个泛型函数内部定义,即变成了这个的成员方法,又该如何定义它呢?...这个问题在Java是通过模板(也叫做泛型)来解决的,例如常见的容器ArrayList、HashMap均是模板,Android开发的异步任务AsyncTask也是模板。...不过正如声明变量那样,如果编译器能够根据初始值判断该变量的类型,就无需显式指定该变量的类型;模板也存在类似的偷懒写法,如果编译器根据输入参数就能知晓参数类型,则调用模板的构造函数也不必显式指定参数类型

1.3K30

Swift学习总结

10、for-in循环支持where子句,如 for i in 1…100 where I%3==0 { } Where子句是用来替代for-in的if条件判断使代码看起来更优雅,是可替代的。...结构体提供了一种默认的初始化方法,会将所有属性都作为参数。与结构体不同,没有默认的成员初始化方法。 方法实现属性如果遇到同名参数才需要指定self,不然则不需要。...某个实例需要修改或写入存储时,该实例才会产生一份自己的副本,在这之前,它们会维护自己对同一份存储的引用。...这里的多继承协议,有点类似c++的抽象了 你可以协议的继承列表,通过添加 class 关键字来限制协议只能被类型遵循,结构体或枚举不能遵循该协议。...5、swift把c++模板特性引入,称为泛型。

3K20
  • 《Effective Objective-C》干货三部曲(二):规范篇

    第2条: 的头文件尽量少引用其他头文件 有时,A需要将B的实例变量作为它公共API的属性。...但是个别的时候,必须在头文件引入其他的头文件: 主要有两种情况: 该类继承于某个,则应该引入父的头文件。 该类遵从某个协议,则应该引入该协议的头文件。而且最好将协议单独放在一个头文件。...虽然直观上可以知道这个方法通过传入的两个参数来组成矩形的size,但是我们并不知道哪个是矩形的宽,哪个是矩形的高。 来看一下正确的?...而且,哪个参数是高度,哪个参数是宽度,看得人一清二楚。永远要记得:代码是给人看的。 笔者自己总结的方法命名规则: 每个冒号左边的方法部分最好与右边的参数名一致。...第26条:勿分类声明属性 除了实现文件里的class-continuation分类可以声明属性外,其他分类无法向中新增实例变量。

    91321

    《Effective Objective-C》干货三部曲(二):规范篇

    第2条: 的头文件尽量少引用其他头文件 有时,A需要将B的实例变量作为它公共API的属性。...但是个别的时候,必须在头文件引入其他的头文件: 主要有两种情况: 该类继承于某个,则应该引入父的头文件。 该类遵从某个协议,则应该引入该协议的头文件。而且最好将协议单独放在一个头文件。...虽然直观上可以知道这个方法通过传入的两个参数来组成矩形的size,但是我们并不知道哪个是矩形的宽,哪个是矩形的高。 来看一下正确的?...而且,哪个参数是高度,哪个参数是宽度,看得人一清二楚。永远要记得:代码是给人看的。 笔者自己总结的方法命名规则: 每个冒号左边的方法部分最好与右边的参数名一致。...第26条:勿分类声明属性 除了实现文件里的class-continuation分类可以声明属性外,其他分类无法向中新增实例变量。

    81910

    设计规则

    无标志特性的枚举应通过使用零值来定义成员,这样默认值即为该枚举的有效值。 如果应用了 FlagsAttribute 特性的枚举定义值为零成员,则该成员的名称应为“None”,以指示枚举尚未设置值。...另外,out 和 ref 参数之间的差异没有得到广泛了解。 CA1024:适用处使用属性 公共或受保护方法的名称以“Get”开头,没有采用任何参数或返回的值不是数组。 该方法可能很适于成为属性。...如果可以按照有意义的方式组合一个枚举的已命名常数,则对该枚举应用 FlagsAttribute。 CA1028:枚举存储应为 Int32 枚举是一种值类型,它定义一组相关的已命名常数。...CA1040:避免使用空接口 接口定义提供某个行为或使用协定的成员。 接口所描述的功能可以被任何类型采用,不管该类型出现在继承层次结构哪个位置。 类型通过实现接口的成员来实现接口。...CA1061:不要隐藏基方法 如果派生方法的参数签名只是类型方面有所不同,而且与基方法的参数签名的对应类型相比,这些类型的派生方式更弱,则基类型的方法由派生类型的同名方法隐藏。

    2K20

    小朋友学Python(10):CC++JavaPython的关键字

    自动变量,只定义它们的时候才创建,定义它们的函数返回时系统回收变量所占存储空间。对这些变量存储空间的分配和回收是由系统自动完成的。一般情况下,不作专门说明的局部变量,均是自动变量。...auto C++98/03这个这个关键字用于声明块的变量的生存期为自动生存期,若是对象同时具有自动存储,即生存期块结束时结束。这样的变量被称为局部变量。...extern, export 为了访问其他编译单元(如另一代码文件)的变量或对象,对普通类型(包括基本数据、结构和),可以利用关键字extern,来使用这些变量或对象时;但是对模板类型,则必须在定义这些模板对象和模板函数时...static 和C语言类似,声明静态存储期对象。C++还有另一个用途——用于作用域声明,表示声明的成员是共有的,不需要通过的对象访问。 sizeof 返回类型名或表达式具有的类型对应的大小。...|枚举 extends |表明一个类型是另一个类型的子类型,这里常见的类型有和接口 final |用来说明最终属性,表明一个不能派生出子类,或者成员方法不能被覆盖,或者成员域的值不能被改变

    1.4K80

    【笔记】《深入理解C++11》(上)

    初始化列表的效果总是慢于就地初始化, 但也快过构造函数中进行赋值 注意: 非常量的静态变量依然要在头文件外定义从而保证程序只存在一个 sizeof()可以对成员表达式使用了 模板也可以声明友元了..., 例如当存在非POD成员且这个成员有非平凡的构造函数时, 这个union的默认构造将被删除 匿名的union对外是开放的, 因此放在的声明可以按照构造函数的不同初始化为不同的类型, 此时被称为枚举式的...SFINEA的原因int对f1的尝试不算做实例化的error, 属于匹配过程的一次failure f(10); } 基于对这个匹配过程的标准化描述, 我们可以无关编译器地对模板匹配的可行性进行判断...下面是这类做法的一个简单样例 // From: https://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error // 这段展示如何利用模板在编译器判断模板参数是否具有某个定义的符号...endl; // 输出 false // foo两者都可以满足, 同时对于f2来说匹配更加特化, 因此实例化了f2, 从而true // 通过这样对于函数匹配的hack操作, 我们可以在编译期获得某个模板参数是否具有某个属性

    1.9K20

    一起学Excel专业开发22:使用模块创建对象1

    Excel应用程序,经常使用模块来创建自已的对象,用于: 1.封装VBA和Windows API代码,使之更易于使用或重用。 2.捕获事件。 3.引发事件。 4.创建自已的对象和对象模型。...模块,所有的公共变量或属性过程都可作为对象的属性,所有的公有过程或函数均可作为对象的方法。...属性过程用于控制变量与外界交互,有3种形式: 1.直接对属性赋值 2.使用Set语句为属性赋值对象 3.使用Get语句返回值或对象引用 CCell模块,使用了2个私有的模块级变量来存储属性值:变量...muCellType存储单元格的类型,其值为anlCellType枚举成员值;变量mrngCell存储某个单元格的引用,它表示由CCell所创建的对象。...CCell模块,使用Set语句给Cell属性指定一个Range型的引用并将其保存到变量mrngCell

    97920

    如何编写高质量的代码

    2、z 枚举不要提供setter 没必要,而且危险 三元操作符的类型务必一致 不一致会导致自动类型转换,类型提升int->float->double等 避免带有变长参数的方法重载 变长参数的方法重载之后可能会包含原方法...switch的default代码块增加AssertionError错误; (switch语句使用枚举作为判断条件时,避免出现增加了一个枚举项,switch语句没做任何修改,编译不会出现问题,但是在运行期会发生非预期的错误...使用valueOf前必须进行校验; (Enum.valueOf()方法会把一个String类型的名称转变为枚举项,也就是枚举查找出字面值与该参数相等的枚举项。...简单说,就是父定义抽象模板作为骨架,其中包括基本方法(是由子类实现的方法,并且模板方法被调用)和模板方法(实现对基本方法的调度,完成固定的逻辑),它使用了简单的继承和覆写机制。...但是运行结果出现奇怪现象:部分线程还是启动了,也就是某些线程(没有规律)的start方法正常执行了。不符合判断规则的情况下,不可启用状态的线程还是启用了,这是线程启动(start方法)一个缺陷。

    1K20

    记一次愚蠢的操作--线程安全问题

    系统架构 概括:service系统提供一个RPC接口,别人调用我提供的接口,我service系统对这个消息进行判断、拼接等等业务逻辑,最后会将这个消息放到消息队列里边。...小王的这些邮件又十分在意是否成功发送出去了,如果发送失败了他那边需要重发。于是,他监听我们DB的binlog,根据binlog的信息来判断是否需要重发。...,比如我发现小王某个参数传进来有问题,我反手就是: Response.PARAM_ERROR service系统主要做了两件事 判断参数/类型,各种业务逻辑有没有问题,将小王带过来的参数封装成Task...于是我就去找原因啦,查代码的时候发现前同事还在Service系统某个留了一个注解@NotThreadSafe。...使用枚举就不应该带有状态的属性(能修改、可变的属性) 推荐阅读: 在工作中常用到的SQL Github上有哪些Java面试/学习相关的仓库推荐?

    41440

    前端入门10-JavaScript语法之对象声明正文-对象

    通过构造函数方式如何给新创建的对象添加一些初始化的属性,这些细节和原理函数一节再讲,这里需要注意一点的就是,当不往构造函数传参数时,此时括号是允许可以省略的。...原型 原型可以理解成 Java 的父概念。 JavaScript ,对象也存在继承关系,继承的双方都是对象,对象是从对象上继承的,被继承的那个对象称作原型。...添加属性 但需要注意一点的是,不像 Java 在编写代码,为添加成员变量时,可以只声明却初始化。 JavaScript ,是不允许这样的。...Object.keys() 参数传入需要遍历属性的对象,通过该方法,可以获得一个数组对象,数组内就存储参数传入的对象的自有属性属性是可枚举性的,相当于 for-in 方式结合 hasOwnProperty...,接下去就是如何操作了,先看一下,如果获取对象某个属性的描述信息: Object.getOwnPropertyDescriptor() 还是通过Object 的一个方法,接收两个参数,第一个参数是对象,

    86430

    3小时Java入门

    基本数据类型相对非常底层,基本类型相同值的对象占有同样的存储单元,判断是否相等可以用 ==。...没有构造方法初始化属性时,引用类型的字段默认是null,int类型默认值是0,布尔类型默认值是false。 我们可以为一个定义多个构造方法,使用时可以根据参数类型和数量自动进行匹配。...十九,静态属性和静态方法 通过static修饰的属性为静态属性,通过static修饰的方法为静态方法。 静态属性和静态方法属于不属于特定的实例,的实例之间共享。...二十五,泛型 泛型就是编写模板代码来适应任意类型。Java的容器中大量使用了泛型。 泛型的好处是使用时不必对类型进行强制转换,它通过编译器对类型进行检查。...5,C++ 可以的外部可以定义函数,Java不允许和接口外面直接定义方法。

    2.7K30

    Unity基础教程系列(九)——形状行为(Modular Functionality)

    1.4 需要的时候添加行为 SpawnZone.SpawnShape,将这些行为组件添加到形状并设置其属性不是形状本身的属性。 ? 在这里可以使用var吗?...尽管未定义显式构造函数方法的情况下,仍然具有隐式公共默认构造函数方法,但这不能保证它们的一定存在。因此,我们必须通过明确要求存在不带参数的构造函数方法来进一步限制模板类型。...然后,可以将该行为的实例添加到ShapeBehaviorPool  池中,不是其自身类型的池中。...扩展方法可以在任何或结构定义,因此我们将使用专用的静态ShapeBehaviorTypeMethods,可以将其与枚举放在同一文件。 ? 什么是扩展方法?...扩展方法是静态的静态方法,其行为类似于某种类型的实例方法。该类型可以是任何东西,、接口、结构、原始值或枚举。扩展方法的第一个参数定义了该方法将要操作的类型和实例值。

    1.3K40

    Java基础重构-面向对象

    所以我们使用继承的时候。首先得明白:子类是一种能特殊的父。 对于具备以下条件之一才使用继承,否则使用 组合 也能实现的复用。 子类需要额外增加属性不仅仅是属性值的改变。...从多个具有相同特征的抽象出了一个抽象,以这个抽象作为其子类的模板,从而避免了子类设计的随意性。...抽象体现的就是一种模板模式的设计,抽象作为多个子类的通用模板,子类抽象的基础上进行扩展,改造,但子类总体上会大致保留抽象的行为方式。 什么是接口?...抽象作为系统多个子类的共同父,它所体现的是一种模板设计。...为什么静态内部的实例方法也不能访问外部类的实例属性? 因为静态内部类是外部类的相关的,不是外部类的对象相关的。也就说说,静态内部类对象不是寄生在外部类的实例,而是寄生在外部类的本身

    65030

    解放双手!ChatGPT助力编写JAVA框架

    可以看到和设想的还是有些区别的,本想是将枚举放在上。然后枚举属性有name,key,和desc。 name:代表枚举map最外层map的key。 key:代表枚举的key或值字段。...4.2 框架核心说明 ChatGPT给出核心代码之后,参考Spring模块设计最终初版框架如下: PackageScanner:用于扫描给定包带有指定注解的的实用工具。...PropertiesUtils:提供操作属性文件的实用方法的工具。 EnumInfo:用于标注枚举的注解,指定枚举项的名称、key 字段和 desc 字段信息。...EnumContextFactory:枚举上下文工厂,用于创建和获取单例的枚举上下文对象。 EnumDefinition:表示枚举定义的,用于存储枚举的信息。...在业务系统管理端进行前后端分离的过程,研发们发现有许多枚举对应的枚举描述需要给前端返回。 1)一开始设想的是每个枚举都写代码给前端封装返回文字。

    41930

    JS葵花宝典秘籍笔记,为你保驾护航金三银四

    属性只能定义函数体。 该属性表示的是实际传入的参数个数,不是声明的参数个数。...需要传入一个对象,该传入对象的自有可枚举属性(即其自身定义的属性不是其原型链上的枚举属性)将为新创建的对象添加指定的属性值和对应的属性描述符。 返回值 一个新对象,带着指定的原型对象和属性。...使用 apply, 你可以只写一次这个方法然后另一个对象中继承它,不用在新对象重复写该方法。...concat()会将参数衔接到array得到一个新数组并返回,它不会修改array,如果传给concat()的某个参数本身是一个数组,则会将该数组的元素衔接到array不是数组本身。...任意多个字符串参数 // body 指定函数体的字符串 // 返回 新创建的Function对象 // 异常 SyntaxError 表示body参数某个argument_names参数存在

    1.9K10

    读书笔记

    如果不行,则把协议单独放在一个头文件,然后将其引入; 有时候在编写头文件时,需要引入某个A(如作为当前某个属性来使用),但是不需要知道这个A的实现细节,此时我们不需要直接引入这个A的头文件...应该用枚举来表示状态机的状态,传递给方法的选项以及状态码等值,给这些值起个易懂的名字; 如果把传递给某个方法的选项表示为枚举类型,多个选项又可以同时使用,则将各选项值定义为2的幂,以便通过按位或操作将其组合起来...switch 语句并没有处理所有的枚举; 2 对象、消息、运行期 2.1 理解“属性”这一概念 可以用 @property语法来定义对象中所封装的数据; 通过“特质”来指定存储数据所需的正确说到底; 设置属性所对应的实例变量时...isMemberOfClass 能够判断出对象是否为某个特定的实例;isKindOfClass 能够判断出对象是否为某类或其派生的实例; 3 接口与API设计 3.1 用前缀避免命名空间冲突 选择与你的公司...,使调用者可通过此参数来决定应该把块安排在哪个队列执行; 6.4 用块引用其所属对象时不要出现保留环 如果块所捕获的对象直接或间接地保留了块本身,那么就得当心保留环的问题; 一定要找个适当的时机解除保留环

    48920

    Object 的几个很相似的方法

    ) 的区别 Object.assign()、 Object.create() 和 newObject() 这三个方法 in 和 hasOwnProperty() 两方法的区别 ---- 这两个方法用来判断一个属性是否是某个对象的...in 运算符用来判断属性指定的对象或其原型链是否存在。 hasOwnProperty() 方法相较于 in,该方法会 忽略掉那些从原型链上继承到的属性。...2.使用 ES6 来实现 ---- 另一种方法是 利用 ES6 创建后,的方法是挂载到的原型上的,而且这些方法默认是不可枚举的。...因此利用这个对象可以实现对象的复制,不是引用,这在实际开发是很有用的。因为一旦引用了某个对象,如果改变其中的属性值,那么其它引用该对象的那个属性值也将会改变,这往往是我们不希望看到的。...综上, Object.create() 方法可以改变一个对象的原型,或者说创建一个对象,让这个对象的原型变成你指定的对象; newObject() 可以包装任意的变量,使之成为一个包装 Object.assign

    58510

    JAVA入门学习十三

    java.lang.class对象; 初始化某个的子类 直接使用java.exe命令来运行某个 2.加载器概述 加载器概述:负责将.class文件加载到内存,并为之生成对应的class文件,...JDK的JRE里lib目录下rt.jar文件; Extension ClassLoader 扩展加载器: 负责JRE的扩展目录的jar包的加载,JDKJRE的lib目录下的ext目录;...,解剖使用的就是Class的方法,所以要先获取每个字节码文件对应的class类型的对象; 总结:反射Reflect一切都是赤裸裸的,包括私有的成员变量; Class方法: //的实例代表一个运行...执行指定字节码的方法 三种方式: (1)Class静态方法forName读取配置文件 (2)静态属性class锁对象 (3)Object 的getClass()发布方法判断两个对象是否是同一个字解码文件...,程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以动态代理其实就是通过反射来生成的一个代理; Javajava.lang.reflect包下提供了一个Proxy和一个InvocationHandler

    55320

    JAVA入门学习十三

    java.lang.class对象; 初始化某个的子类 直接使用java.exe命令来运行某个 2.加载器概述 加载器概述:负责将.class文件加载到内存,并为之生成对应的class文件,...JDK的JRE里lib目录下rt.jar文件; Extension ClassLoader 扩展加载器: 负责JRE的扩展目录的jar包的加载,JDKJRE的lib目录下的ext目录;...,解剖使用的就是Class的方法,所以要先获取每个字节码文件对应的class类型的对象; 总结:反射Reflect一切都是赤裸裸的,包括私有的成员变量; Class方法: //的实例代表一个运行...执行指定字节码的方法 三种方式: (1)Class静态方法forName读取配置文件 (2)静态属性class锁对象 (3)Object 的getClass()发布方法判断两个对象是否是同一个字解码文件...,程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以动态代理其实就是通过反射来生成的一个代理; Javajava.lang.reflect包下提供了一个Proxy和一个InvocationHandler

    40910
    领券