gpt4 book ai didi

c++ - 如何让 C++ 堆栈具有多种数据类型?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:39:40 26 4
gpt4 key购买 nike

问题是:

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

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

但是,编程语言需要能够保存多种数据类型,例如整数、 double 、字符串和 3D vector (如具有 X、Y 和 Z 分量的物理 vector ),仅举一些简单的例子.

那么,在 C++ 中是否有一种结构可以用作堆栈,能够存储不止一种原始类型/对象/结构?

最佳答案

当然,一种方法是使用标记 union :

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

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

struct Value {
Type type;
Data data;
};

as_integer 的存储, as_double等会重叠,所以 Value structure 将占用两个存储字,并且您的堆栈类型为 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>),并且数据值的解释取决于对其进行操作的单词。在这种情况下,您可以通过 union 或 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*> .然后,您不必担心不同的值大小,而代价是在运行时制作包装器结构并分配它们的实例。

关于c++ - 如何让 C++ 堆栈具有多种数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21805574/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com