【问题标题】:Storing elements of different type in a vector/array in C++?在 C++ 中的向量/数组中存储不同类型的元素?
【发布时间】:2012-11-19 10:13:14
【问题描述】:

我正在尝试用 C++ 创建一个简单的动态语言解释器。我希望能够声明动态类型数组,但我不确定如何将它们存储在 C++ 中的某个对象中。

在 Ruby/Python 中,我可以存储任何我想要的东西,但是在 C++ 中执行此操作的有效方法是什么?

(另外,如果有人有一个 simple 用于 Ruby 等动态语言的开源词法分析器/解析器/解释器的链接,我将不胜感激。

【问题讨论】:

    标签: c++ interpreter dynamic-languages dynamic-typing


    【解决方案1】:

    您必须根据您的语言语义推出一些自定义解决方案。例如,您可以使用boost::any存储任何对象,但您将无法执行名称查找等操作。一些汇编程序的知识在这里很有用,因为您基本上是在模仿它。大多数人做的事情是这样的

    struct Object {
        boost::any cppobject;
        std::unordered_map<std::string, std::function<void(boost::any&, std::vector<boost::any>&)> funcs;
    };
    
    std::vector<Object> stuff;
    

    当用你的假设语言,你有类似的东西

    stuff[0].hi();
    

    然后你可以把它转换成类似的东西

    std::vector<boost::any> args;
    // fill args
    stuff.at(0).funcs["hi"](stuff.at(0).cppobject, args);
    // now args holds the result
    

    这个方案很可能进一步优化,但不能进一步推广,因为它已经是最通用的了。

    【讨论】:

    • 听起来是我收到的 4 个回复中最好的主意。我会试一试。谢谢:)
    【解决方案2】:

    动态语言存储通用对象的方式是通过指针,你可以在 C++ 中做同样的事情。存储指向您在 C++ 类中定义的通用“对象”的指针,这是一种有效的方法。

    【讨论】:

      【解决方案3】:

      boost::variant 是使用联合或动态分配通用基类型的对象(并通过 dynamic_cast 或等效构造适当地向下转换它们)的替代方法,它允许您编写如下代码:

      typedef boost::variant<int, float, char, std::string> LangType;
      std::vector<LangType> langObjects;
      

      如果您的设计允许这样的实现,那么它的优点是编译时安全并避免使用堆、虚函数和多态向下转换所带来的任何损失。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-11
        • 1970-01-01
        • 2019-06-24
        • 1970-01-01
        • 2011-08-05
        • 1970-01-01
        相关资源
        最近更新 更多