我需要一种在声明阶段初始化向量的“优雅”方式,其中要包含另一个和几个额外元素的内容。
我要解决的是:
让我们考虑以下带有初始化的(示例)声明:
const std::vector<std::string> c90_types = {
"char",
"signed char",
"unsigned char",
"short",
"unsigned short",
"int",
"unsigned int",
"long",
"unsigned long",
"float",
"double",
"long double"
};
const std::vector<std::string> c99_types = {
"char",
"signed char",
"unsigned char",
"short",
"unsigned short",
"int",
"unsigned int",
"long",
"unsigned long",
"float",
"double",
"long double",
"long long",
"unsigned long long",
"intmax_t",
"uintmax_t"
};
如您所见,c99_types
有一个子集正好是c90_types
。我想避免需要更改子集然后手动更改“超集”的情况,只是为了避免可能引入错误的额外步骤:)
附带说明一下,我不想编写如下代码:
second.insert(second.begin(), first.begin(), first.end());
second.push_back(something);
有什么好的和干净的解决方案吗?
有一个技巧叫“我想用一些复杂的东西初始化一个const变量”。C ++ 11成为了可能,这是从Javascript偷来的。
const std::vector<std::string> c90_types = {
"char",
// and so on, and so forth....
};
const std::vector<std::string> c99_types = ([&](){
const auto additional_types = { // initializer_list<const char *>, but it does not matter.
"long long",
"unsigned long long",
"intmax_t",
"uintmax_t"
};
std::vector<std::string> vec{c90_types};
vec.insert(vec.end(), additional_types.begin(), additional_types.end());
return vec;
})();
将您的初始化逻辑打包到一个未命名的lambda中,然后立即调用它,将const变量复制初始化。
vec
已移动,未复制。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句