我正在尝试创建static const
默认对象(规则)的列表,这些列表要经常复制,因此,我想将它们存储在{{1}的vector
中}。我注意到类似的问题已经进行了几次,但是我不清楚这是否确实可行(我倾向于不可行)。即
unique_ptr<>
与initializer_list
一起使用,因为对成员的访问是常量,从而导致复制操作。因此两者:
unique_ptr
和
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
感觉很讨厌,但是代码接口保持相对不变,并且由于它没有离开类的范围,因此对用户也是透明的。
感谢任何想法,更正或更好的选择。
编辑-关于this question,我已经测试了该解决方案,它也可以工作。我对解决方案的问题是,它使static const std::string kString1 = "String 1";
static const std::string kString2 = "String 2";
static const std::vector<const std::string*> kStrings = {&kString1, &kString2};
的使用方式不符合设计目的,而且我也不知道会有什么意外的结果。
答案 0 :(得分:7)
我误会了吗?还有另一种初始化此类向量的方法
有一个调用返回非常量向量的函数来用作初始化程序。它甚至不必被命名。可能是立即调用的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,因此甚至没有函数调用的开销。确实是在吃蛋糕也要吃。
尽管有人想知道为什么要使用一个指向字符串的唯一指针向量(值类型)。向量已拥有其内容。因此,您可能会削减中间人,这也将简化初始化。