私がBOOST_FOREACHを使って作業するとき、単純なテンプレートでは問題ありません。しかし、マップを反復しようとすると、たとえば要素型をtypedefする必要があります。typedefのないBOOST_FOREACHとテンプレート
回避策はありますか?
私がBOOST_FOREACHを使って作業するとき、単純なテンプレートでは問題ありません。しかし、マップを反復しようとすると、たとえば要素型をtypedefする必要があります。typedefのないBOOST_FOREACHとテンプレート
回避策はありますか?
マクロなので、カンマを含む型は処理できません(プリプロセッサはテンプレートについて認識しません)。
ループの前に変数を宣言することもできます。documentationを参照してください。
std::map<int, double> my_map;
//1)
typedef std::pair<int, double> MyPair;
BOOST_FOREACH(MyPair p, my_map) { ... }
//2)
std::pair<int, double> p;
BOOST_FOREACH(p, my_map) { ... }
編集:
特にstd::map
とのさらなる合併症があります:value_type
はstd::pair<Key, Value>
ではなく、std::pair<const Key, Value>
。したがって
、(あなたは、foreachループで参照を使用する場合と唯一の方法)あなたはtypedefで、より適切な方法で行く場合は、しかし、そのウォンを
typedef std::pair<const int, double> MyPair;
//or
typedef std::map<int, double>::value_type MyPair;
BOOST_FOREACH(MyPair& ref, my_map) { ... }
を使用することです後でstd::pair<const int, double>
インスタンスに代入することはできません(constフィールドに代入することはできません)ので、ループの前に宣言された変数を使用したい場合は、作業してください。この場合、ブーストのマニュアルとしてpair<int, double>
しか使用できません。
BOOST_FOREACH_PAIR
我々の経験ではうまく機能別のオプションです:
あなたがマップを反復処理する必要がある場合は、最も簡単な方法は、正しいを取得するので、タプルを使用することですtypedefに入力すると面倒です。ここでは、タプルを使用する方法である。
std::map<int, double> my_map;
int key;
double value;
BOOST_FOREACH(boost::tie(key, value), my_map) { ... }
ただ、ノート括弧がキーと値の周囲に配置されているので、コンマはここに動作します。プリプロセッサは、カンマと括弧のみを認識します(c99では引用符も理解する必要があります)。したがって、std::pair<int, double>
の<>
を解析することはできません。ただし、括弧を使用してプリプロセッサを助けることができます。私たちは、このように呼ばれているコンテナを返しAA機能している場合たとえば、:だから
BOOST_FOREACH(int i, foo<int, int>()) { ... } //This won't compile
を、我々は表現の周りに括弧を置くことができ、それはプリプロセッサを助ける:
BOOST_FOREACH(int i, (foo<int, int>())) { ... } //This will compile
しかし、マップの場合、宣言の周りに括弧を置くことはできません(式ではないため)。それはこの(std::pair<int, double> p) = *it
ような何かに変身れますので
BOOST_FOREACH((std::pair<int, double> p), my_map) { ... } //This won't work
を、そしてそれは、もちろん、間違ってC++である:これは動作しません。しかし、ネクタイを使用すると、上記のようにループの外側でキーと値を宣言するだけでよいでしょう:
BOOST_FOREACH(tie(key, value), my_map) { ... } //This will work
さらに、ループに意味のある名前を付けることができます。 p.first
の代わりにkey
、p.second
の代わりにvalue
と書くことができます。
これは、このような単純なことができ:
C++ 11標準を使用してBOOST_FOREACH(auto& p, my_map) { ... }
、自動C#でVARのようなものです、それはあなたがおそらくをしなければならない
BOOST_FOREACH(std::pair<int, double>& p, my_map) { ... }
を行います:STD :: map :: value_type –
またC++ 11で; BOOST_FOREACH(auto&ref、my_map){...} –