【问题标题】:C++ container for heterogeneous POD types异构 POD 类型的 C++ 容器
【发布时间】:2017-06-06 10:55:27
【问题描述】:

是否有一种异构容器形式,能够存储例如不同的原始类型(例如intfloatdouble)?

最终我希望能够在不明确引用类型的情况下在计算中使用元素,例如 auto res = a + b,其中操作数 ab 是从容器中拉出的元素,可以是相同或不同的类型。

【问题讨论】:

  • 您正在寻找一种弱类型的编程语言。为什么需要在 C++ 中执行此操作?好吧,也许可以考虑 Boost 的 Variant 或 Any。
  • C++ 是一种静态类型语言。这意味着每个对象的类型是在编译时指定的,而不是运行时。 C++ 从根本上不像你描述的那样工作。
  • @CodyGray:而是“动态类型”,它仍然可以是“强类型”。只是不是“静态类型”
  • 可以使用std::tuple
  • @CinCout 元组只能在编译时知道元素数量的情况下使用。另外,您应该只知道类型进入的顺序。如果您声明一个具有float 作为其第三个元素的元组,则在执行期间无法更改。我还建议boost variant

标签: c++ c++11 stl containers


【解决方案1】:

使用 C++17,您可以将 std::any 与任何容器一起使用。对于较旧的 C++ 版本,您可以使用 boost::any

#include <iostream>
#include <vector>
#include <any>

struct A
{
    int a;
    explicit operator int() const { return a; }
};

struct B
{
    double b;
    explicit operator double() const { return b; }
};

int main()
{
    A a{ 5 };
    B b{ 6.};

    std::vector<std::any> v;
    v.push_back(3 );
    v.push_back(4.);
    v.push_back(a );
    v.push_back(b );

    for (auto const e : v)
    {
        if (e.type() == typeid(double))
            std::cout << std::any_cast<double>(e) << std::endl;

        if (e.type() == typeid(B))
            std::cout << (double)std::any_cast<B>(e) << std::endl;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-31
    • 2011-12-09
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    相关资源
    最近更新 更多