-2

这里有一个新手问题...

如何制作一个元组类型,其中元组的一个项目是一个特定项目enum

enum class MyEnum
{
  MyEnum_FirstItem
};

typedef std::tuple<int, MyEnum::MyEnum_FirstItem> MyTuple; // constant "MyEnum::MyEnum_FirstItem" is not a type name

如何获取类型,而不是枚举项的值?

PS 用“获取枚举项类型”谷歌搜索,但一无所获。

我来自 TypeScript,我曾经在那里这样做是为了记录文档。此外,真正的问题可能应该是:c++ 中是否有任何确切的数字类型?

4

2 回答 2

6

如何获取枚举项的类型?

的类型MyEnum_FirstItemMyEnum。枚举数没有不同的类型。

(但是,请继续阅读……)


你想在这里做什么?您是否正在尝试创建一个其第二个参数只能具有值 MyEnum_FirstItem 的元组?– Sneftel 3 分钟前

@Sneftel 是的,完全正确 – Nurbol Alpysbayev 2 分钟前

 

c++ 中是否有任何确切的数字类型?

其实,是。

std::integral_constant<int, 3>是表示值 3 的类型int。它用于模板元编程。

也许你可以用它做点什么。因为,虽然MyEnum_FirstItem不是它自己类型,但您可以将其包装起来以产生这样的东西,如下所示:

std::integral_constant<MyEnum, MyEnum::MyEnum_FirstItem>

所以也许:

std::tuple<int, std::integral_constant<MyEnum, MyEnum::MyEnum_FirstItem>> MyTuple;

参考


我猜想这个枚举的目的是作为一个“标签”来区分各种其他相同的元组类型,用于文档目的(并防止代码库中的“交叉污染”)。

如果是这样,我实际上只是struct为这项工作创建了一堆空的 s,就像我们为其他标记实现所做的那样。

struct TagA {};
struct TagB {};

std::tuple<int, TagA> MyTuple;

它更易于使用和阅读,如果您愿意,您仍然可以将它们放入命名空间。

于 2019-08-21T13:25:18.827 回答
3

您将类型与该类型的实例混淆了。MyEnum是一个类型,MyEnum::MyEnum_FirstItem是该类型的一个实例。尝试

typedef std::tuple<int, MyEnum> MyTuple; 

然后稍后您可以MyEnum::MyEnum_FirstItem在 a 中拥有第二个值MyTuple

只是重申...

PS用“获取枚举项目类型”谷歌搜索,但一无所获..

的类型MyEnum::MyEnum_FirstItemMyEnum

于 2019-08-21T13:22:30.373 回答