我想要做的東西像下面這樣:使用std ::領帶的範圍內環路目標
//std::vector<std::pair<TypeA, TypeB>> someInitializingFunction();
{
TypeA a;
TypeB b;
for (std::tie(a, b) : someInitializingFunction()) {
// do stuff;
}
}
然而,這不是有效的代碼,因爲,作爲標準說,基於for循環的範圍是定義爲等同於:
{
auto && __range = range-init;
for (auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin) {
for-range-declaration = *__begin;
statement
}
}
凡爲範圍聲明定義爲:
換範圍聲明: ATTR ibute-specifier-seq_ {opt} decl-specifier-seq聲明者
那麼,讓我回想起decl-specifier-seq沒有標記爲可選的?
因此,看來我必須求助於傳統風格的for循環爲這一個一拉:
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;
}
}
但它似乎有點語法什麼似乎直覺是一個相當常見的任務凌亂,拆包函數調用的結果,在許多其他情況下都是有效的。
有沒有建議在語言中增加一些東西?這是否合理?有沒有更好的方法來做到這一點,我忽略了?我誤讀了標準嗎?
顯然,我可以把自己的功能放在一起來做到這一點,但這也有點混亂。
**更新:**它也許可以做,在C++ 17具有非常直觀的語法。 [他們目前在「結構化綁定」工作](http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2015/p0144r0.pdf)。然後可以這樣做:for(auto {a,b}:myList)'。 – leemes