如何使C ++堆栈具有多个数据类型?

堆栈追踪器

这是问题所在:

我目前正在尝试创建一个简单的基于堆栈的编程语言(反向波兰符号,FORTH风格)作为较大项目的组成部分。不过,我遇到了障碍。

在C ++中创建堆栈(使用std::vector<>没有问题,该堆栈将包含一种类型的元素(例如,我可以使用语法std::vector<double> Stack)。

但是,一种编程语言需要能够保存多种数据类型,例如整型,双精度型,字符串和3D向量(例如在具有X,Y和Z分量的物理向量中),仅举一些简单的事情。

那么,在C ++中是否有一个我可以用作堆栈的结构,该堆栈可以存储多种原始类型/对象/结构?

乔恩·普迪(Jon Purdy)

当然,一种方法是使用带标签的联合:

enum Type { INTEGER, DOUBLE, /* ... */ };

union Data {
    uint64_t as_integer;
    double as_double;
    // ...
};

struct Value {
    Type type;
    Data data;
};

对于存储as_integeras_double等会重叠,所以Value结构会占用存储的两个词,而你的筹码将有类型std::vector<Value>然后,您data根据的值访问的成员type

void sub(std::vector<Value>& stack) {
    // In reality you would probably factor this pattern into a function.
    auto b = stack.back();
    stack.pop_back();
    assert(b.type == INTEGER);

    auto a = stack.back();
    stack.pop_back();
    assert(a.type == INTEGER);

    Value result;
    result.type = INTEGER;
    result.data.as_integer = a.data.as_integer - b.data.as_integer;
    stack.push_back(result);
}

当然,Forths通常是无类型的,这意味着堆栈仅由单词(std::vector<uint64_t>组成,并且对数据值的解释取决于对其进行操作的单词。在这种情况下,您可以reinterpret_cast在每个单词的实现中通过并集或适当的类型来输入双关语

void subDouble(std::vector<Data>& stack) {
    // Note that this has no type safety guarantees anymore.
    double b = stack.back().as_double;
    stack.pop_back();

    double a = stack.back().as_double;
    stack.pop_back();

    Data result;
    result.as_double = a - b;
    stack.push_back(result);
}

void subDouble(std::vector<uint64_t>& stack) {
    double b = reinterpret_cast<double&>(stack.back());
    stack.pop_back();

    double a = reinterpret_cast<double&>(stack.back());
    stack.pop_back();

    double result = a - b;
    stack.push_back(reinterpret_cast<uint64_t&>(result));
}

或者,您可以不存储值,而可以存储指向类实例的指针,该类的Value其他值类型(例如IntegerDouble可以从中得出)

struct Value {};
struct Integer : Value { uint64_t value; };
struct Double : Value { double value; };
// ...

您的堆栈的类型为std::vector<unique_ptr<Value>>std::vector<Value*>这样,您就不必担心值的大小不同,而以制作包装器结构并在运行时分配它们的实例为代价。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使C ++堆栈具有多个数据类型?

来自分类Dev

如何用Java创建具有多个数据类型的数组以在另一个类中使用

来自分类Dev

如何在具有多个键和值轨道的hstore数据类型中存储数据5

来自分类Dev

如何动态创建具有表数据类型的变量?

来自分类Dev

具有数据类型名称的C ++表

来自分类Dev

如何根据python中的条件更改多个数据框列的数据类型?

来自分类Dev

如何构造一个包含多个数据类型值的字节数组?

来自分类Dev

如何在数组中存储多个数据类型?

来自分类Dev

如何处理在文本框中输入的多个数据类型值以进行搜索

来自分类Dev

如何构造一个包含多个数据类型值的字节数组?

来自分类Dev

C ++在函数声明中错误两个或多个数据类型

来自分类Dev

c ++统一管理多个数据类型

来自分类Dev

C ++在函数的声明中错误两个或多个数据类型

来自分类Dev

使用C#中的collection添加多个数据类型

来自分类Dev

如何用这些不同的数据类型提供包含具有不同数据类型的向量的函数?

来自分类Dev

如何在 C# 中拥有多个派生类型的单个数据集合?

来自分类Dev

当有多个可能的类型构造函数时,如何使用数据类型中的特定构造函数

来自分类Dev

用于C#的Oracle数据类型存储堆栈跟踪

来自分类Dev

C ++中的动态堆栈数据类型声明

来自分类Dev

如何在Android拖放中通过Clipdata发送和接收多个数据和数据类型?

来自分类Dev

如何使用Java SQL将具有不同数据类型的数据库表插入

来自分类Dev

如何在python中创建具有不同数据类型的伪数据?

来自分类Dev

如何编码具有多种数据类型的数据集?

来自分类Dev

如何替换列可能具有不同数据类型条目的数据框中的字符

来自分类常见问题

Pandas-如何定义具有相同数据类型的所有列的条件

来自分类Dev

Pandas-如何定义具有相同数据类型的所有列的条件

来自分类Dev

T-SQL具有“时间”数据类型-C#是否仅具有“时间”而不是“日期时间”数据类型?

来自分类Dev

如何创建一个可以在Java中存储多个数据类型对象的arraylist类

来自分类Dev

如何从R中具有多个条件的一个数据帧创建多个数据帧

Related 相关文章

  1. 1

    如何使C ++堆栈具有多个数据类型?

  2. 2

    如何用Java创建具有多个数据类型的数组以在另一个类中使用

  3. 3

    如何在具有多个键和值轨道的hstore数据类型中存储数据5

  4. 4

    如何动态创建具有表数据类型的变量?

  5. 5

    具有数据类型名称的C ++表

  6. 6

    如何根据python中的条件更改多个数据框列的数据类型?

  7. 7

    如何构造一个包含多个数据类型值的字节数组?

  8. 8

    如何在数组中存储多个数据类型?

  9. 9

    如何处理在文本框中输入的多个数据类型值以进行搜索

  10. 10

    如何构造一个包含多个数据类型值的字节数组?

  11. 11

    C ++在函数声明中错误两个或多个数据类型

  12. 12

    c ++统一管理多个数据类型

  13. 13

    C ++在函数的声明中错误两个或多个数据类型

  14. 14

    使用C#中的collection添加多个数据类型

  15. 15

    如何用这些不同的数据类型提供包含具有不同数据类型的向量的函数?

  16. 16

    如何在 C# 中拥有多个派生类型的单个数据集合?

  17. 17

    当有多个可能的类型构造函数时,如何使用数据类型中的特定构造函数

  18. 18

    用于C#的Oracle数据类型存储堆栈跟踪

  19. 19

    C ++中的动态堆栈数据类型声明

  20. 20

    如何在Android拖放中通过Clipdata发送和接收多个数据和数据类型?

  21. 21

    如何使用Java SQL将具有不同数据类型的数据库表插入

  22. 22

    如何在python中创建具有不同数据类型的伪数据?

  23. 23

    如何编码具有多种数据类型的数据集?

  24. 24

    如何替换列可能具有不同数据类型条目的数据框中的字符

  25. 25

    Pandas-如何定义具有相同数据类型的所有列的条件

  26. 26

    Pandas-如何定义具有相同数据类型的所有列的条件

  27. 27

    T-SQL具有“时间”数据类型-C#是否仅具有“时间”而不是“日期时间”数据类型?

  28. 28

    如何创建一个可以在Java中存储多个数据类型对象的arraylist类

  29. 29

    如何从R中具有多个条件的一个数据帧创建多个数据帧

热门标签

归档