【问题标题】:Make a user defined variable array创建一个用户定义的变量数组
【发布时间】:2020-06-03 18:19:28
【问题描述】:

我必须编写一个简单的代码,它将一个字符作为输入或一个带有整数的字符串。然后根据输入生成一个标准向量。如果文本说 int 我有一个 int 向量。 唯一的问题是,即使是空的,我也不想为每个变量类型声明一个向量,并且我想让它可扩展,所以如果有一天我想在其中放入一个结构或其他东西,我可以。

dvec::dvec( char t){
if ( t=='i')
    vector<int> a;
else if( t=='f')
    vector<float> a;
}

【问题讨论】:

  • 为什么不使用模板?
  • @yaodav 你仍然会在使用你的对象时遇到麻烦,它的类型取决于运行时信息。你需要使用variant,模板所有使用它的东西,或者使用其他方案来抽象出具体类型。
  • 我们可能必须知道如何使用这个类的上下文。如果有关类型的信息仅在运行时已知还是在编译时已知。 char t 参数建议运行时,但我不确定是否需要。
  • *我必须写一个简单的代码..." 我不认为你可以为此编写一个简单的代码。
  • 你也可以使用(如果你使用c++17)std::any或std::variant,但是当你尝试使用变量时你需要知道类型

标签: c++ user-defined-types user-defined


【解决方案1】:

如果您想要的只是原始类型或指针,您可以创建一个联合(大小为 8 个字节)和该联合的一个向量。这有点 C'ish,但模板是一种编译时解决方案,因此对于可链接的解决方案,您需要为每种类型提供空间。每种类型都可以有 getter、setter、构造函数。

【讨论】:

    【解决方案2】:

    你可以通过两种方式实现这个东西:

    1.

    using element_type = std::variant<char, int, float /* ... other types */>;
    
    using dvec = std::vector<element_type>;
    

    这将是类型安全的,尽管缺点是向量的每个元素都是一个变体,这可能不是您想要的。

    2.

    using dvec = std::variant<std::vector<char>,
                              std::vector<int>,
                              std::vector<float> /* ... other vector types */>;
    

    这将为您提供向量的变体,其中所有向量元素都是同质的。

    这个繁琐的表达式可以通过使用Boost.Mp11来简化

        template<class T> using vectorize_t = std::vector<T>;
    
    template<typename ...T>
        using dvec = std::variant<mp_transform<vectorize_t, T...>>;
    

    基本上将T...中的所有相应类型放入std::vector。

    【讨论】:

      【解决方案3】:

      编写一个辅助函数来完成真正的工作。

      template <typename T>
      void do_work() {
          std::vector<T> a;
          // do stuff
      }
      // ...
      if(t == 'i') {
          do_work<int>();
      }
      else if(t == 'f') {
          do_work<float>();
      }
      else if(t == 's') {
          do_work<your_struct>();
      }
      

      根据您的具体用途,您可能需要(或至少希望)让do_work 只需调用多个函数,这样您就可以在需要时进行专业化。

      【讨论】:

        猜你喜欢
        • 2019-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-10-20
        • 2015-10-28
        • 2021-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多