【问题标题】:Generic container & variable element access通用容器和变量元素访问
【发布时间】:2013-02-19 11:47:52
【问题描述】:

在我的变量数据中,当运行“添加变量”脚本代码时,如何为所有类型定义一个通用容器?访问它们的通用公式是什么?这很烦人,因为我必须为每种类型(int float double 等)定义一个矢量模板。我的变量应该只包含一个通用向量对象,无论它是 int、float 或 double 等。这可能吗?有什么想法吗?

【问题讨论】:

  • 为什么要为每种类型定义一个向量模板?如果您使用 C++,我认为 template 完全可以消除这种需求。写一个template,它应该适用于所有类型(满足某些要求)。但是你为什么把它标记为C?!
  • @xersi 不清楚你想要什么。能给个用例吗?你是在说像在 Java 中那样做 std::vector<?> 吗?
  • 我不完全明白你需要什么,但你可能想看看boost::any
  • 在容器中使用boost::variantboost::any
  • @xersi 但这就是 C++ 的工作原理!它是一种静态类型的语言。编译器必须决定类型。它不能生成适用于任意类型的东西。

标签: c++ vector


【解决方案1】:

这就是标准模板库..

的全部意义所在
std::vector<int>
std::vector<float>

两个向量 - 同一个类,使用不同类型模板化。

如果您想要不同类型的容器,您可能需要查看std::tuple

【讨论】:

    【解决方案2】:

    如果您想要一个包含多种不同类型对象的向量,那么您可能需要使用boost::any,或者可能是boost::variant

    【讨论】:

      【解决方案3】:

      编辑:

      哦,您想要一个适合任何类型的容器吗?是的你可以。但在一定的限制范围内。

      boost::anyboost::variantboost::variant 将使您能够保存 在声明 boost::variant 时枚举的几种类型的数据boost::any 不会让你枚举你想要支持的所有类型,但你需要自己转换它们才能取回值。

      简而言之,您必须将类型信息存储在其他地方(使用 boost::any 时),或者只支持几种类型(例如,支持 intdouble 使用 boost::variant 的异构向量)


      template 在 C++ 中的工作原理正是通过消除为每种类型编写相同类的需要。 例如:

      // function template
      template <class T>
      T GetMax (T a, T b) {
        T result;
        result = (a>b)? a : b;
        return (result);
      }
      

      这个GetMax 应该适用于具有&gt; 运算符的任何类型。这正是template 在 C++ 中的用途。

      如果您需要更多关于在 C++ 上实现向量的帮助(顺便说一下,对于具有自己的构造函数和析构函数的自定义类型,这并不是那么简单。您可能需要 allocator 才能取消初始化空间),阅读此(Implementation of Vector in C++)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-03-30
        • 2020-11-10
        • 1970-01-01
        • 2022-01-23
        • 1970-01-01
        • 2012-05-08
        • 2016-07-10
        相关资源
        最近更新 更多