09/03/02 12:55:03
関数オブジェクトにしといてfor_each()じゃだめなのか
169:デフォルトの名無しさん
09/03/03 21:45:22
>>168
それ、コードではどうやるの
170:デフォルトの名無しさん
09/03/04 01:25:00
こんな感じ?
template <class T>
struct Out {
void operator()(T& i) const {
std::cout << i << ' ';
}
};
int main()
{
int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
std::list<int> aa(a, a + sizeof(a) / sizeof(a[0]));
std::for_each(aa.begin(), aa.end(), Out<int>());
}
171:デフォルトの名無しさん
09/03/04 12:40:27
ostream_iteratorにassignという手も
172:デフォルトの名無しさん
09/03/04 16:04:02
例としてよく引き合いに出されるのは ostream_iterator に copy だと思うが・・・
173:デフォルトの名無しさん
09/03/04 16:19:22
for_eachを使うと copy よりも凝った出力形式を作れるってくらいかな
174:デフォルトの名無しさん
09/03/05 09:49:02
#include <pstade/oven/io.hpp>
#include <pstade/oven/make_range.hpp>
int main()
{
namespace oven = pstade::oven;
std::list<int> l = a|oven::copied;
std::cout << (oven::make_range(l)) << "\n";
}
175:デフォルトの名無しさん
09/03/10 23:08:36
>>136,143
URLリンク(www.open-std.org)
今のドラフトでは以下の記述が追加されている。
> algorithms that take function objects as arguments are permitted to copy those function objects freely
アルゴリズム内でどうコピーされるかは基本的に実装任せってことになるらしい。
for_each() の戻り値はまったく使えないことになりそうだ。
176:デフォルトの名無しさん
09/03/14 16:56:46
>>175
for_eachの戻りはコピーされた関数オブジェクトに内部状態が反映されてるんじゃなかった?
177:デフォルトの名無しさん
09/03/14 18:17:17
>176
関数オブジェクトに全要素を通して処理した結果の状態が保持されていることを期待するだろうが、
極端に言えば各要素の呼び出し毎に新しくコピーした関数オブジェクトを渡されたりすると、期待する
結果と異なる。
参照使うなりコピーされても大丈夫なようにはできるからまったく使えないは言い過ぎ。
とはいえ、そういう用途なら accumulate 使えばいいじゃん、とは思う。
178:デフォルトの名無しさん
09/03/14 18:22:46
boost::ref使って渡せばいいんじゃないか。boost::mpl::for_eachではうまくいった
179:デフォルトの名無しさん
09/03/18 22:23:42