简单的问题,我无法在网上找到答案.在可变参数宏中,如何查找参数的数量?如果它有解决方案,我可以使用boost预处理器.
如果它有所不同,我试图转换可变数量的宏参数来增强预处理器序列,列表或数组以进行进一步的重新处理.
是否有可能确定c ++的基数enum class
:
enum class Example { A, B, C, D, E };
Run Code Online (Sandbox Code Playgroud)
sizeof
但是,我尝试使用它返回枚举元素的大小.
sizeof(Example); // Returns 4 (on my architecture)
Run Code Online (Sandbox Code Playgroud)
有没有一种获得基数的标准方法(在我的例子中为5)?
众所周知,C++中的内置枚举不是类型安全的.我想知道实现类型安全枚举的哪些类在那里使用...我自己使用以下"自行车",但它有点冗长和有限:
typesafeenum.h:
struct TypesafeEnum
{
// Construction:
public:
TypesafeEnum(): id (next_id++), name("") {}
TypesafeEnum(const std::string& n): id(next_id++), name(n) {}
// Operations:
public:
bool operator == (const TypesafeEnum& right) const;
bool operator != (const TypesafeEnum& right) const;
bool operator < (const TypesafeEnum& right) const;
std::string to_string() const { return name; }
// Implementation:
private:
static int next_id;
int id;
std::string name;
};
Run Code Online (Sandbox Code Playgroud)
typesafeenum.cpp:
int TypesafeEnum::next_id = 1;
bool TypesafeEnum::operator== (const TypesafeEnum& right) const
{ return id == right.id; }
bool TypesafeEnum::operator!= …
Run Code Online (Sandbox Code Playgroud) 在C++中,是否可以枚举枚举(运行时或编译时(首选))并为每次迭代调用函数/生成代码?
示例用例:
enum abc
{
start
a,
b,
c,
end
}
for each (__enum__member__ in abc)
{
function_call(__enum__member__);
}
Run Code Online (Sandbox Code Playgroud)
合理的重复:
enum
C++中的类型是相当基本的; 它基本上只是为标签创建了一堆编译时值(可能具有适当的范围enum class
).
将相关的编译时常量分组在一起非常有吸引力:
enum class Animal{
DOG,
CAT,
COW,
...
};
// ...
Animal myAnimal = Animal::DOG;
Run Code Online (Sandbox Code Playgroud)
然而,它有各种各样的缺点,包括:
在这篇文章中,我试图创建一种解决这些缺点的类型.
一个理想的解决方案采用常量的编译时知识及其与字符串的关联的概念,并将它们组合成一个类似于scoped-enum的对象,可以通过enum id和enum string name进行搜索.最后,结果类型将使用尽可能接近枚举语法的语法.
在这篇文章中,我将首先概述其他人为各个部分所尝试的内容,然后介绍两种方法,一种完成上述方法,但由于静态成员的初始化顺序而具有未定义的行为,另一种解决方案不那么漂亮语法但由于初始化顺序没有未定义的行为.
关于获取枚举中的项目数量(1 2 3)以及网上提出的大量其他问题(4 5 6)等,有很多问题.而且普遍的共识是,没有确定 -火的方式做到这一点.
仅当您强制执行枚举值为正且增加时,以下模式才有效:
enum Foo{A=0, B, C, D, FOOCOUNT}; // FOOCOUNT is 4
Run Code Online (Sandbox Code Playgroud)
但是,如果您尝试编码某种需要任意值的业务逻辑,则很容易被破坏:
enum Foo{A=-1, B=120, C=42, D=6, FOOCOUNT}; // ????
Run Code Online (Sandbox Code Playgroud)
所以Boost的开发人员试图用Boost.Enum来解决这个问题,Boost.Enum使用了一些相当复杂的宏来扩展到一些至少会给你大小的代码.
在迭代枚举中有一些尝试; 可以迭代的类似枚举的对象,理论上允许隐式大小计算,甚至在[7](7 8 9,...)的情况下明确允许
尝试实现这一点通常会导致自由浮动函数和使用宏来适当地调用它们.(8 …
如何获得枚举数
我有一个Enum
typedef enum{
DEL_TIME_VALUE = -1,
DEL_TIMESEC_VALUE = 100,
DEL_TIMEMIN_VALUE = 200,
DEL_TIMEHOUR_VALUE = 300,
DEL_DAY_VALUE = 1000,
DEL_COUNT_VALUE = 1000,
....
.....
.....
DEL_END =90002
}WORKINGTIME;
Run Code Online (Sandbox Code Playgroud)
我如何得到枚举计数.
我在下面尝试循环!
for(int i=DEL_TIME_VALUE; i<=DEL_END; i++) {
}
Run Code Online (Sandbox Code Playgroud)
我猜它不好!
任何人都可以告诉我如何获得枚举数!在枚举中声明.
提前致谢!
这里有一些代码可能会起作用:
#include <cassert>
#include <limits>
enum test { A = 1 };
int main()
{
int max = std::numeric_limits<test>::max();
assert(max > 0);
}
Run Code Online (Sandbox Code Playgroud)
但它在Linux上的GCC(4.6.2)和clang(2.9)都失败了:枚举类型的max()实际上是零!即使您使用C++ 11枚举类型说明符来明确说明您希望枚举具有哪种类型,这仍然是正确的.
为什么是这样?至于C++ 11的行为,它是否被明确要求?我在N2347中没有提到它,这是关于强类型枚举的论文.
有没有办法在C++中获得union的成员数量?例如:
union U
{
int a;
double b;
char c;
};
int main()
{
std::cout << std::union_members_count<U>::value << std::endl; // prints 3
}
Run Code Online (Sandbox Code Playgroud)
当然,std::union_members_count<>
是虚构的.
如果有办法,我该如何实施/使用它?
可能重复:(
如何)我可以计算枚举中的项目?
有没有办法获得枚举中的常量数?
例如:
enum C{id,value};
Run Code Online (Sandbox Code Playgroud)
以后这将返回2:
//pseudo code
get<C>::value
Run Code Online (Sandbox Code Playgroud)
而且,是否可以通过[] optor访问这些常量?喜欢ie:
C [0]会返回id
c++ ×7
c++11 ×3
enums ×3
enumeration ×2
c ×1
c++03 ×1
cardinality ×1
enum-class ×1
ipad ×1
iphone ×1
type-safety ×1