VBで「with」という処理があるのですがC++でこれと同じようにするためにはどのように記述すればよいのでしょうか。ご回答いただければ嬉しく思います。
できません。
言語使用ですからあきらめましょう。
訂正)
>言語使用ですからあきらめましょう。
言語仕様ですからあきらめましょう。
Belution に似たようなスレがあった。
http://forums.belution.com/ja/vc/000/321/38s.shtml
belutionのスレでも書いていますが、
C++の勉強をする時は一旦VBの知識は封印した方が良いです。
アルゴリズムとか言語によらない部分は使えますが、
言語使用に関しては全く別物です。
かえってVBの知識が邪魔になると思います。
あうあう。
「言語使用」ではなくて「言語仕様」でした。
longName.longLongName.hoge = 3;
longName.longLongName.piyo = "aa";
みたいになって鬱陶しくなっているのなら,参照で短いalias付けて
{
SomeType& st = longName.longLongName;
st.hoge = 3;
st.piyo = "aa";
}
って感じですかねー
ちょっとあがいてみました.
これだとWITHの中でbreakとか使えませんが.
#include <string>
#include <iostream>
#include <boost/typeof/typeof.hpp> // boost sandboxとか参照
#include <boost/type_traits/add_reference.hpp>
#include BOOST_TYPEOF_INCREMENT_REGISTRATION_GROUP()
struct Hoge
{
int a;
std::string b;
};
BOOST_TYPEOF_REGISTER_TYPE(Hoge)
#define WITH(obj) \
for (bool f = true; f;) \
for (boost::add_reference<BOOST_TYPEOF(obj)>::type _ = obj; f; f = false)
int main()
{
Hoge hoge;
WITH(hoge)
{
_.a = 3;
_.b = "test";
}
std::cout << hoge.a << std::endl;
std::cout << hoge.b << std::endl;
}
そこまでして使わなくてもいいのではと言う気もしますけれど、
試みとしては面白いかも。
但し、自分のプロジェクトでこんな事をする人がいたら
やめてくれと言うでしょうね。
WITHのブロックが大きくなると可読性が落ちそうだし。
>自分のプロジェクトでこんな事をする人がいたらやめてくれと言うでしょうね。
この辺はそのテクニックがどれだけ認知されているかによると思います.Boost.Foreach然り.
まあ,私はwithで可読性は上がらないと思ってますので,こんなの使いませんが(笑)
ツイート | ![]() |