循环范围内的初始化列表

Jur*_*aho 13 c++ for-loop range initializer-list c++11

我有从单个超类型派生的不同类型的对象.我想知道std::initializer在循环范围内使用list 是否有任何缺点,如下所示:

for(auto object: std::initializer_list<Object *>{object1, object2, object3}) {
}
Run Code Online (Sandbox Code Playgroud)

它是完全正常和有效还是使用阵列会更好?对我来说,std::array解决方案似乎对编译器更具限制性,并且存在明确说明大小的缺点:

for(auto object: std::array<Object*, 3>{object1, object2, object3}) {
}
Run Code Online (Sandbox Code Playgroud)

是否有任何其他或更好的方法迭代明确给定的对象列表?

Tem*_*Rex 10

没有必要std::initializer_list在循环内使用详细信息

#include <iostream>
#include <initializer_list>

struct B { virtual int fun() { return 0; } };
struct D1 : B { int fun() { return 1; } };
struct D2 : B { int fun() { return 2; } };

int main()
{
    D1 x;
    D2 y;

    B* px = &x;
    B* py = &y;

    for (auto& e : { px, py })
            std::cout << e->fun() << "\n";    
}
Run Code Online (Sandbox Code Playgroud)

实例.

如果你想这样做的即时没有定义pxpy,你的确可以使用std::initializer_list<B*>{ &x, &y }内循环.


Mat*_*asB 8

你可以简单地写

for(auto object : {object1, object2, object3}) {
   // work
}
Run Code Online (Sandbox Code Playgroud)

  • `{obj,obj}`的名字是什么?这只是一个初始化列表,还是有一个特殊的名称? (3认同)
  • 当然,这只能按原样使用,如果 (A) `objectN` 肯定已经是指针(否则效率低下,对象切片,仅更新真实元素的临时副本等),并且 (B) 对象属于上述常见类型;基/派生组合需要详细语法 AFAICT。@TankorSmash这是一个_braced init-list_,可以推导为各种类型,但 `std::initializer_list` 被赋予最高优先级。 (2认同)