【问题标题】:Fill array with elements at certain positions用特定位置的元素填充数组
【发布时间】:2017-03-22 12:17:42
【问题描述】:

Given 是一个 std::array,其中包含 IMyClass 的子类的实例:

std::array<std::shared_ptr<IMyClass>, 20> myArr;

在索引位置 0、5 和 10

std::make_shared<RareSubClass>()

应该在所有其他索引上分配

std::make_shared<FrequentSubClass>()

实现这一目标的最佳方法是什么?

【问题讨论】:

  • 如何为那些需要成为RareSubClass的元素提供索引?是硬编码的吗?
  • 运行时初始化可以吗?
  • @AndyG 是的,RareSubClass 实例总是在提到的位置。
  • @user1056903:那么可能最好进行统一初始化。 std::array&lt;...&gt; myArr = {make_shared&lt;FrequentSubClass&gt;(), make_shared&lt;RareSubClass&gt;(), ...};

标签: c++ arrays pointers inheritance polymorphism


【解决方案1】:

在运行时使用一个小的辅助函数很容易初始化该数组:

 void init_array(std::array<std::shared_ptr<IMyClass>, 20>& arr) {
      int slot = 0;
      for(auto& subclass : arr) {
         switch(slot) {
         case 0:
         case 5:
         case 10:
             subClass = std::make_shared<RareSubClass>();
             break;
         default:
             subClass = std::make_shared<FrequentSubClass>();
             break;
         }
         ++slot;
      }
 }

【讨论】:

  • 谢谢!我将循环变量用于当前数组位置。
  • @user 因为它是std::array,并且在编译时一切都可以推导出来,我什至可以想到一个元编程解决方案,它使用带有0,5,10 参数的可变参数模板类。但我怀疑到目前为止的努力是否值得(不过这将是一个有趣的实验)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-05
  • 1970-01-01
  • 2018-05-21
  • 2022-08-04
  • 2012-06-13
  • 1970-01-01
  • 2018-04-04
相关资源
最近更新 更多