Boost総合スレ part7at TECH
Boost総合スレ part7 - 暇つぶし2ch234:デフォルトの名無しさん
09/03/21 09:35:01
BOOST_FOREACH(const int& i,C)

BOOST_FOREACH(int const& i,C)
も同じ意味

235:デフォルトの名無しさん
09/03/21 09:37:23
そもそもconst int&でなくintにしてみたらどうだろう。

それでだめならforeachの実装覗くしかないんじゃね。

236:デフォルトの名無しさん
09/03/21 12:06:26
class step_iterator : public boost::iterator_facade<step_iterator,int , boost::bidirectional_traversal_tag>
{
public:
explicit step_iterator(int v, int s = 1):value(v), step(s){}
private:
friend class boost::iterator_core_access;
void increment()
{
value += step;
}
void decrement()
{
value -= step;
}
int& dereference() const
{
return value;
}
bool equal(const step_iterator& other) const
{
return value >= other.value;
}
int value;
int step;
};

237:236
09/03/21 12:07:13
>>236
int に対する iterator で increment でstepずつ増やす iterator を
作ってみてるのですが、dereference() の箇所で
error C2440: 'return' : 'const int' から 'int &' に変換できません。
とエラーになってしまいます。
メンバーのvalueをintへのポインターにして、dereference()で*valueを
返す様にしたら期待した動作をしてくれます。
また、const_cast しても期待した動作になります・・・
なぜ、int では駄目なのでしょうか?


238:デフォルトの名無しさん
09/03/21 12:46:15
URLリンク(d.hatena.ne.jp)
ここのUDP通信のソースで質問なんだけど、
send_to()ではIPとポート指定してるのに、
何故recv_from()では必要無いんですか?

boost::asio::ip::udp::socket がIPとかを記録するんじゃないかと思ったんだけど、
リファレンスマニュアル見ても明確に書いてなかった

239:デフォルトの名無しさん
09/03/21 14:32:08
>>236
メンバ関数のconst外す or 戻り値にconst付ける
>>238
郵便を送るには送り先住所が必要ですが、受け取るにはポストを設置しておけばいいだけです。
receive_fromに渡しているendpointは差出人の住所を受け取るためのバッファです。
ちなみにそのページの非同期コードは未定義だね。

240:デフォルトの名無しさん
09/03/21 15:00:11
>>239
>>戻り値にconst付ける
error C2440: 'return' : 'const int' から 'int &' に変換できません。

>>メンバ関数のconst外す
error C2662: 'step_iterator::dereference' : 'const step_iterator' から 'step_iterator &' へ 'this' ポインタを変換できません。

iterator_core_access::dereference が
static typename Facade::reference dereference(Facade const& f)
{
return f.dereference();
}
だから const はずせないです。

241:デフォルトの名無しさん
09/03/21 15:04:38
>237
> int& dereference() const
const メンバ関数なので this は const step_iterator*。
従って、メンバの value も const int になります。
これは変更不可能なので、変更可能な参照 int& として返すことができません。
value を int* にした場合は、int * const になり、ポインタ値としては const ですが、
指している int の値は変更可能なので int& にできます。

> public boost::iterator_facade<step_iterator,int , boost::bidirectional_traversal_tag>
> int& dereference() const
ではなくて
> public boost::iterator_facade<step_iterator,const int , boost::bidirectional_traversal_tag>
> const int& dereference() const
でどうでしょう?

242:デフォルトの名無しさん
09/03/21 15:18:52
>>241
うまくいきました。
dereference()して値を変えたい場合は、ポインターなどにしてやる必要があるんですね。

>const メンバ関数なので this は const step_iterator*。
>従って、メンバの value も const int になります。
>これは変更不可能なので、変更可能な参照 int& として返すことができません

調べてると、「mutableでないと駄目」とか書いてあったけど、↑のことだったのか・・・


243:デフォルトの名無しさん
09/03/21 15:58:49
>>238
recv_fromはbindでポートと結びついてるソケットで読み込んでるからでないの?


244:238
09/03/21 16:17:09
>>239
UDPでは(?)どのポートに来たメッセージも受信できちゃうってことですか?

>>243
bind()ではポート番号とか渡してないみたい

245:デフォルトの名無しさん
09/03/21 18:27:28
>244
send_toの時にバインドされてる

246:238
09/03/22 08:53:20
>>245
やっぱそうなのか
この辺で失礼します。ありがとう

247:デフォルトの名無しさん
09/03/22 18:01:34
vc2008EE sp1 winxp boost1.38(boostpro)で
int x = 1, y = 10;
(boost::lambda::_1 + boost::lambda::protect(boost::lambda::_1 + 2))(x)(y);
がコンパイル通らないんだけど、なんで?

error C2664: 'boost::lambda::lambda_functor<T>::lambda_functor(const boost::lambda::lambda_functor<T> &)' : 1 番目の引数を 'const boost::lambda::lambda_functor<T>' から 'const boost::lambda::lambda_functor<T> &' に変換できません。

248:デフォルトの名無しさん
09/03/22 18:57:14
とりあえず解決法だけ
(x)を(boost::cref(x))にする(refでもおk)
gcc-4.4, boost trunkで動作確認できた

249:デフォルトの名無しさん
09/03/22 21:42:42
Boostライブラリって同じ機能・もしくはちょっと違う機能のついた別クラスが
多い.
こういうとこ改善しないのかな?

250:デフォルトの名無しさん
09/03/22 21:59:52
>>249
具体的にどれのこと?全部挙げなくて良いからさ。

あと、改善しないのか気になるんなら、直接提案してみれば良いよ。

251:デフォルトの名無しさん
09/03/22 22:22:20
249じゃないけど、bindとlambda::bindとかtupleとfusionとか
これまで書かれたコードがあるから一本化できないんだろ
どっちかが非推奨になることはあるかもしれんが

boostのライブラリは便利だけど、組み合わせようとするとあれ?ってなる感じがする。
lambdaはresult_ofに対応したんだっけ?

252:デフォルトの名無しさん
09/03/22 22:33:56
boost/functionを使うときにはたいていboost/bindも使うとか
文字列処理クラスが機能かぶってるとかのことを言ってるのか?

おれは↑と他ちょっとしかboostしないから知らないけどなんかあんの?

253:247
09/03/22 22:46:02
boost::protect の一番わかりやすい(シンプルな)
サンプルコード教えてください。
(boost::protectの有無で結果変わるやつ)

254:232
09/03/24 22:59:56
>>233-235
直らなかったので、ソースを調べました。
コンパイラのバージョンチェックがまずかったようです。
boost/foreach.hppの頭のほうの行の
|| BOOST_WORKAROUND(BOOST_INTEL_WIN, <= 810)
を、以下のように変えたらコンパイラが通りました。
|| BOOST_WORKAROUND(BOOST_INTEL_WIN, <= 1100)

とりあえず、これで様子見です。



最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch