【发布时间】:2018-07-08 05:46:11
【问题描述】:
我正在尝试创建一个static const 的默认对象(规则)列表,这些默认对象(规则)太大而无法经常复制,因此我想将它们存储在vector 的unique_ptr<> 中。我注意到类似的问题已经进行了几次,但我不清楚这是否真的可行(我倾向于不可行)。即
- 您不能将
initializer_list与unique_ptr一起使用,因为对成员的访问是 const 导致复制操作。 - 您不能通过引用传入临时对象,从而导致复制操作。
因此两者:
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 能够以一种并非旨在使用的方式使用,我不知道会产生什么意外后果(如果有的话)。
【问题讨论】: