1

std::pairまたは匿名struct型を使用して for ループで 2 つの異なる変数を宣言および初期化することは認識していますが、これらは私の目的では機能しません。

次のクラス定義があるとしましょう

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;
};

ループラインで anObjectと anを初期化する方法はありますか? 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 ループ内で表示されるようになります。これは回避しようとしています。

これを実際に使用するのは aとstd::lock_guard<std::mutex>aboolであるため、ループを終了した後にミューテックスが解放されます。

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 に答える