我试图创建一个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"))
};
Run Code Online (Sandbox Code Playgroud)
和
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"))
);
Run Code Online (Sandbox Code Playgroud)
不可行.
我误会了吗?有没有其他方法来初始化这样的矢量或者这是重新考虑设计的情况?我能想到的最简单的替代方法是创建对象a 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};
Run Code Online (Sandbox Code Playgroud)
它感觉很讨厌,但代码接口保持相对不变,因为它不会离开类的范围,所以对用户也是透明的.
任何想法,更正或更好的选择是值得赞赏的.
编辑 - 关于这个问题,我已经测试了解决方案,它也有效.我的解决方案的问题是它能够initializer_list以不被设计使用的方式使用,而且我不知道会产生什么样的意外后果,如果有的话.
我误会了吗?有没有另一种方法来初始化这样的矢量
有一个函数返回一个非常量向量来用作初始化器.它甚至不必命名.它可能是一个立即调用的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.
Run Code Online (Sandbox Code Playgroud)
现在您可以拥有复杂的初始化逻辑并将其kStrings视为const.此外,编译器很可能完全内联lambda,因此甚至不会有函数调用的开销.它真的是你的蛋糕和吃它.
虽然你不得不想知道为什么你要使用一个独特的字符串指针向量(值类型).向量已经拥有其内容.所以你可能会削减中间人,这也将简化初始化.
| 归档时间: |
|
| 查看次数: |
118 次 |
| 最近记录: |