【问题标题】:Can you initialise "static const vectors" of unique_ptrs? (C++17 with GCC 7.3)你能初始化 unique_ptrs 的“静态常量向量”吗? (带有 GCC 7.3 的 C++17)
【发布时间】:2018-07-08 05:46:11
【问题描述】:

我正在尝试创建一个static const 的默认对象(规则)列表,这些默认对象(规则)太大而无法经常复制,因此我想将它们存储在vectorunique_ptr<> 中。我注意到类似的问题已经进行了几次,但我不清楚这是否真的可行(我倾向于不可行)。即

  1. 您不能将 initializer_listunique_ptr 一起使用,因为对成员的访问是 const 导致复制操作。
  2. 您不能通过引用传入临时对象,从而导致复制操作。

因此两者:

static const std::vector<std::unique_ptr<std::string>> kStrings = {
  std::unique_ptr<std::string>(new std::string("String 1")),
  std::unique_ptr<std::string>(new std::string("String 1"))
};

static const std::vector<std::unique_ptr<std::string>> kStrings(
  std::unique_ptr<std::string>(new std::string("String 1")),
  std::unique_ptr<std::string>(new std::string("String 1"))
);

不可行。

我是不是误会了?是否有另一种方法来初始化这样的向量,或者这是重新考虑设计的情况?我能想到的最简单的替代方法是创建对象static const,然后将它们引用为原始指针。例如:

static const std::string kString1 = "String 1";
static const std::string kString2 = "String 2";

static const std::vector<const std::string*> kStrings = {&kString1, &kString2};

感觉很恶心,但代码接口保持相对不变,因为它不离开类的范围,所以对用户也是透明的。

感谢任何想法、更正或更好的替代方案。

编辑 - 关于this question,我已经测试了解决方案,它也可以工作。我对解决方案的问题是它使initializer_list 能够以一种并非旨在使用的方式使用,我不知道会产生什么意外后果(如果有的话)。

【问题讨论】:

标签: c++ gcc stl c++17


【解决方案1】:

我是不是误会了?有没有另一种方法来初始化这样一个向量

调用一个函数,该函数返回一个非常量向量以用作初始值设定项。它甚至不必命名。它可以是立即调用的 lambda。

static const std::vector<std::unique_ptr<std::string>> kStrings = [] {
  std::vector<std::unique_ptr<std::string>> ret;
  // populate ret
  return ret;
}(); // <-- Invoke the lambda immediately after defining it. 

现在您可以拥有复杂的初始化逻辑并将kStrings 视为 const 仍然。此外,编译器很可能会完全内联 lambda,因此甚至不会产生函数调用的开销。它真的是在吃你的蛋糕并吃它。

尽管人们不得不想知道为什么要使用指向字符串的唯一指针向量(一种值类型)。向量已经拥有它的内容。所以你可以切断中间人,这也将简化初始化。

【讨论】:

  • 太好了,谢谢!我实际上并没有使用字符串,我只是将它们用作示例来演示问题,而无需复制大量代码。相反,我试图初始化一组默认的安全策略规则。我已经测试了您提出的这种方法,它的工作原理与描述的一样。
  • @Vinnie - 我认为这可能是说明性的。但是,如果将来有人偶然发现这个例子(他们正在使用std::string),我不想不提这一点。
猜你喜欢
  • 1970-01-01
  • 2011-04-11
  • 2012-08-18
  • 2021-01-22
  • 2012-12-15
  • 2011-10-06
  • 1970-01-01
  • 2011-02-06
  • 2011-01-23
相关资源
最近更新 更多