gpt4 book ai didi

c++ - 从 antlrcpp::Any 中检索基类

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:07:18 36 4
gpt4 key购买 nike

我目前正在将一些代码从 C# 版本的 ANTLR4 移植到 C++ 目标,但我目前遇到了一些问题。我在 C# 中构建 AST 的方法是创建一个基类(我们称它为 Base)和派生类(我们称它为 Derived)以及我可以用来实现所述类的虚函数。

但是尝试将此代码转换为 C++,我不断收到 bad_cast 异常我已将其缩小为 antlrcpp::Any 未正确地将派生类转换为其基类。例如:

class Base {
public:
virtual std::string ToString() const { return "Base\n"; }
};

class Derived : public Base {
public:
std::string ToString() const override { return "Derived\n"; }
};

int main() {
Derived value;
std::cout << value.ToString(); //Obviously prints out Derived
Base& base_value = value;
std::cout << base_value.ToString(); //Still works exactly as expected and prints Derived

auto any = antlrcpp::Any(value);
auto derived = any.as<Base>(); //internally uses a dynamic_cast and throws a bad_cast
std::cout << derived.ToString(); //never gets to here
}

我最初认为这可能是因为它只适用于指针,但是

auto any = antlrcpp::Any(new Derived());
std::cout << any.as<Base*>()->ToString(); //throws bad_cast

我将 dynamic_cast 更改为 header 内的 static_cast 并且它会进行转换,但它会打印出“Base”。当访问任何数据成员时,C 风格的转换会直接导致崩溃。

我究竟如何使用 antlrcpp::Any 来获取基类?有什么明显的我遗漏的吗?

如果这不可能,我该如何解决这个问题?有 .is() 方法,但是在很多情况下检查访问者的返回值是否属于特定类型是不可行的(例如表达式,可能有 30-40 个运算符)。

最佳答案

antlrcpp::any 类不是为这种情况而设计的。它不是通用的变体实现。

如果您需要,您应该考虑一个自己的 Variant 实现,它使用各种类型等的 union ,这不适用于类型删除。

Unique 指针在这种情况下一般来说可能不是一个好主意,因为它们不支持复制语义(您在这里需要它)。对于访问者的评估,最好改用 shared_ptr

关于c++ - 从 antlrcpp::Any 中检索基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47788499/

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