2009-11-11 19 views

答えて

12

マクロなので、カンマを含む型は処理できません(プリプロセッサはテンプレートについて認識しません)。

ループの前に変数を宣言することもできます。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_typestd::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>しか使用できません。

+1

を行います:STD :: map :: value_type –

+0

またC++ 11で; BOOST_FOREACH(auto&ref、my_map){...} –

8

あなたがマップを反復処理する必要がある場合は、最も簡単な方法は、正しいを取得するので、タプルを使用することです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の代わりにkeyp.secondの代わりにvalueと書くことができます。

+0

キーと値の間のカンマは、プリプロセッサを混乱させるでしょう。 – Ferruccio

+0

@Ferruccioキーと値の間のカンマは、キーと値のまわりのかっこのためにプリプロセッサを混乱させます。さらに、私はマップを反復する必要があるときはいつもこれを行います。 –

+0

私はあなたがプリプロセッサでそれを行うことができないと思いました。 – Ferruccio

2

これは、このような単純なことができ:

C++ 11標準を使用して
BOOST_FOREACH(auto& p, my_map) { ... } 

、自動C#でVARのようなものです、それはあなたがおそらくをしなければならない

BOOST_FOREACH(std::pair<int, double>& p, my_map) { ... } 
関連する問題