Omn*_*ity 24 c++ for-loop tie language-lawyer std-pair
我想做类似以下的事情:
//std::vector<std::pair<TypeA, TypeB>> someInitializingFunction();
{
TypeA a;
TypeB b;
for (std::tie(a, b) : someInitializingFunction()) {
// do stuff;
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这不是有效的代码,因为正如标准所说,基于for循环的范围被定义为等效于:
{
auto && __range = range-init;
for ( auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin ) {
for-range-declaration = *__begin;
statement
}
}
Run Code Online (Sandbox Code Playgroud)
其中for-range-declaration定义为:
for-range-declaration:attribute-specifier-seq_ {opt} decl-specifier-seq声明符
那么阻碍我的是decl-specifier-seq没有标记为可选的?
因此,似乎我必须依靠旧式的循环来实现这个问题:
std::vector<std::pair<TypeA, TypeB>> myList = someInitializingFunction();
{
TypeA a;
TypeB b;
for (auto it = myList.begin(); it != myList.end(); ++it) {
std::tie(a, b) = *it;
// do stuff;
}
}
Run Code Online (Sandbox Code Playgroud)
但是在语法上看起来似乎有些混乱似乎是一个相当常见的任务,解包函数调用的结果,这在许多其他上下文中都是有效的.
是否有建议在语言中添加一些内容?这是否合情合理?有没有更好的方法来做到这一点,我忽略了?我误读了标准吗?
显然,我可以把我自己的功能放在一起做这个,但是使用它也有点麻烦.
Mar*_*cia 16
你仍然可以使用range-for!
//std::vector<std::pair<TypeA, TypeB>> someInitializingFunction();
{
TypeA a;
TypeB b;
for (auto& p : someInitializingFunction()) {
std::tie(a, b) = p;
// do stuff;
}
}
Run Code Online (Sandbox Code Playgroud)
或者,const auto& p
如果您不需要/想要修改p
.
更新:通过上述内容,您还可以使用将元素移动到绑定变量std::move
for (auto& p : someInitializingFunction()) {
std::tie(a, b) = std::move(p);
// do stuff;
}
Run Code Online (Sandbox Code Playgroud)
您提出的语法可能无法很好地处理.一个人为的例子:
for (std::tie(a, b) : std::move(someInitializingFunction())) {}
// Note: std::move here is superfluous, as it's already an r-value
// (may also hinder some optimizations). Purely for demonstration purposes.
Run Code Online (Sandbox Code Playgroud)
就这样,你不必元素的值移到绑定变量,如能力begin()
,end()
从R值容器等不会产生移动迭代器.(嗯,是的,你可以将容器调整为返回移动迭代器的东西,但这将是一个全新的故事)
Omn*_*ity 11
截至2017年3月21日,结构化绑定是C++的一部分.
这允许直接执行以下操作:
//std::vector<std::pair<TypeA, TypeB>> someInitializingFunction();
for (auto [a, b] : someInitializingFunction()) {
// do stuff;
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5772 次 |
最近记录: |