作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我目前正在将一些代码从 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/
我是一名优秀的程序员,十分优秀!