4

編集:

したがって、この質問は非常にばかげた程度に誤解されており、もはや意味がありません。私が実際に尋ねた質問これの私の特定の実装-はい、無意味であることが知られている、はい、慣用的なC ++に遠く離れていない-マクロが可能な限り優れているかどうか、そしてそれが必ずしも使用しなければならなかったauto、または代わりに適切な回避策があった場合。これほど多くの注目を集めることは想定されていませんでしたし、これほどの誤解もありませんでした。回答者に回答を編集してもらうのは無意味です。これで評判を落とすことは望んでいません。将来の潜在的な視聴者のために、ここにはいくつかの良い情報が浮かんでいます。関連する評判を均等に分配するための回答。先に進んでください。ここには何もありません。


この質問を見てwith、C++ でステートメントを書くのは楽しいかもしれないと判断しました。キーワードはこれautoを非常に簡単にしますが、おそらく使用せずにそれを行うより良い方法はありautoますか? 簡潔にするために、コードの一部を省略しました。

template<class T>
struct with_helper {

    with_helper(T& v) : value(v), alive(true) {}

    T* operator->() { return &value; }
    T& operator*() { return value; }

    T& value;
    bool alive;

};


template<class T> struct with_helper<const T> { ... };


template<class T> with_helper<T>       make_with_helper(T& value) { ... }
template<class T> with_helper<const T> make_with_helper(const T& value) { ... }


#define with(value) \
for (auto o = make_with_helper(value); o.alive; o.alive = false)

withこれは、他の言語で見られるの使用を示す、より典型的なケースの (更新された) 使用例です。

int main(int argc, char** argv) {

    Object object;

    with (object) {

        o->member = 0;
        o->method(1);
        o->method(2);
        o->method(3);

    }

    with (object.get_property("foo").perform_task(1, 2, 3).result()) {

        std::cout
            << (*o)[0] << '\n'
            << (*o)[1] << '\n'
            << (*o)[2] << '\n';

    }

    return 0;

}

私が選んだoのは、これが珍しい識別子であり、その形式が「一般的なもの」の印象を与えるためです。より良い識別子またはより使いやすい構文のアイデアがある場合は、それを提案してください。

4

4 に答える 4

7

を使用している場合auto、なぜマクロを使用するのでしょうか?

int main()
{
    std::vector<int> vector_with_uncommonly_long_identifier;

    {
        auto& o = vector_with_uncommonly_long_identifier;

        o.push_back(1);
        o.push_back(2);
        o.push_back(3);
    }

    const std::vector<int> constant_duplicate_of_vector_with_uncommonly_long_identifier
        (vector_with_uncommonly_long_identifier);

    {
        const auto& o = constant_duplicate_of_vector_with_uncommonly_long_identifier;

        std::cout
            << o[0] << '\n'
            << o[1] << '\n'
            << o[2] << '\n';
    }

    {
        auto o = constant_duplicate_of_vector_with_uncommonly_long_identifier.size();
        std::cout << o <<'\n';
    }
}

編集: なしautoで、使用typedefして参照するだけです。

int main()
{
    typedef std::vector<int> Vec;

    Vec vector_with_uncommonly_long_identifier;

    {
        Vec& o = vector_with_uncommonly_long_identifier;

        o.push_back(1);
        o.push_back(2);
        o.push_back(3);
    }
}
于 2010-10-29T20:06:51.997 に答える
6

?? C++へのvb構文の試行

with次のブロックのすべてのことは、デフォルトで、私が正しく実行すると言ったオブジェクトを参照していると言いますか?単一のオブジェクトまたは構造を繰り返し参照する一連のステートメントを実行します。

with(a)
 .do
 .domore
 .doitall

では、この例ではどのように同じ構文が得られますか?

私にとって、複数のde参照でを使用する理由の例

そうではなく

book.sheet.table.col(a).row(2).setColour
book.sheet.table.col(a).row(2).setFont
book.sheet.table.col(a).row(2).setText
book.sheet.table.col(a).row(2).setBorder

あなたが持っている

with( book.sheet.table.col(a).row(2) )
  .setColour
  .setFont
  .setText
  .setBorder

同様に簡単で、C++でのより一般的な構文は

cell& c = book.sheet.table.col(a).row(2);
c.setColour
c.setFont
c.setText
c.setBorder
于 2010-10-29T22:18:21.813 に答える
3

C++0x の場合 (想定している):

int main() {

    std::vector<int> vector_with_uncommonly_long_identifier;

    {
        auto& o = vector_with_uncommonly_long_identifier;

        o.push_back(1);
        o.push_back(2);
        o.push_back(3);

    }
}
于 2010-10-29T20:09:56.550 に答える
0

良いラムダを使用しないのはなぜですか?

auto func = [&](std::vector<int>& o) {
};
func(vector_with_a_truly_ridiculously_long_identifier);

簡単な事実は、識別子が長すぎて毎回入力できない場合は、参照、関数、ポインターなどを使用してこの問題を解決するか、名前をリファクタリングすることです。このようなステートメント (例: C# の using()) には、追加の副作用があります (私の例では決定論的なクリーンアップ)。C++ でのステートメントには、コードを書き出すだけで実際には追加の動作が呼び出されないため、顕著な実際の利点はありません。

于 2010-10-29T20:57:55.377 に答える