1

我知道在 for 循环中使用 astd::pair或匿名struct类型声明和初始化两个不同的变量,但这些对我的目的不起作用。

假设我有以下类定义

class Object {
    private:
        int i;
    public:
        Object(int i) : i(i) { }
        // everything else deleted
        Object() = delete;
        Object(const Object &) = delete;
        Object(Object &&) = delete;
        Object & operator=(const Object &) = delete;
        Object & operator=(Object &&) = delete;
};

有什么方法可以在 循环行中初始化一个Object和一个。我不想在 for 循环或类似的东西周围添加一个额外的块。我可以接受, , anonymous等,只要它有表格intforstd::tuplestd::pairstructs

for(/* creates Object and int*/ ; /*whatever*/; /*whatever*/) { /* ... */}

或(如果存在语法)

for( Object o(69), int i = 0; i < 10; ++i) { /* ... */ }

我不想要的是一个额外的命名类定义。我已经想出了这个:

for(class Container : private Object {
            public:
                int value;
                Container(int i) : Object(i), value(0) { }
                } container(69); /* ... */ ;
        container.value < 10;
        ++container.value) { /* ... */}

但是类名Container随后在 for 循环中变得可见,这是我试图避免的。

我对此的实际使用是 astd::lock_guard<std::mutex>和 a bool,以便在退出循环后释放互斥锁。

4

2 回答 2

6

您可以使用分段构造来调用构造函数:

for (std::pair<Object, int> x (std::piecewise_construct,
                               std::make_tuple(69),
                               std::make_tuple(0));
     x.second < 10; x.second ++) {

    std::cout << x.first.i << "/" << x.second << std::endl;
    x.first.i += 4;
}

不幸的是,这并不能推广到元组。没有分段构造函数std::tuple


不知道你为什么不理会它,但我发现与更直接的实现相比,“对”解决方案非常难看

{
    Object o (69);
    for (int i = 0; i < 10; ++ i) {
        std::cout << o.i << "/" << i;
        o.i += i;
    }
}
于 2013-09-10T18:23:15.063 回答
1

是的,有optional

#include <utlility>

std::optional<Object> o;

for ( ; ; )
{
    o.emplace(12);
}

(这在 C++14 中可用,但也来自<boost/optional.hpp>.)

于 2013-09-10T18:10:16.773 回答