編集:
したがって、この質問は非常にばかげた程度に誤解されており、もはや意味がありません。私が実際に尋ねた質問は、これの私の特定の実装-はい、無意味であることが知られている、はい、慣用的な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
のは、これが珍しい識別子であり、その形式が「一般的なもの」の印象を与えるためです。より良い識別子またはより使いやすい構文のアイデアがある場合は、それを提案してください。