掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
関数オブジェクトと関数ポインタを区別なく扱いたい (ID:66742)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
it find_if(it b, it e, pred p); に対して、提示のサンプルは bool foo(const it& b, const it& e, const pred& p); って違いがあるんだが・・・ ここから類推するに[反復子 (iterator)] と、 [コンテナそのもの、ないしはコンテナに入っている内容 (value_type)] とに 微妙に混乱がありそうな気がするような・・・ 反復子はポインタとほぼ同等とされている (24.1) 反復子の要件として、コピーできること、代入できること (24.1) がある。 STL algorithm は皆、引数に反復子をコピーするよう作られているのに対し 提示の foo は反復子を参照で受け取っている。ここが違うわけね。 だから bool foo(it b, it e, pred p); と直せばお望みどおりとなる。 (述語のほうもコピーとしているのは STL algorithm に準じた結果) 反復子(内容へのポインタ)をコピーしても内容のコピーにはならない。 以下は蛇足 template 型を参照引数から類推する場合 (foo の const T& b から T を得る場合) 渡されたものの型をそのまま変換せずに使う (規格書の章番号が見つからん...) 第一引数:配列 even を直接渡すと T として int[4] が採用される。 第二引数:even+4 は式評価後の型 int* となる 提示の foo では両引数は同一型でなければならないためエラー発生。 STL algorithm は引数が参照でないため暗黙変換が発生する もういっちょ蛇足 あー氏の言うとおり iseven2 には必要な型が一通り実装されていればよい それが template プログラミングのおいしいところだしね。 ただ unary_operator や binary_operator からの派生として実装すれば ・必要な型が一通りすべて欠落なく自動的に実装される ・記述が1行ですむ ・その型がどの STL algorithm に渡せるか自明 ということが保障されるわけで、その辺は標準に従うほうが楽ができるよ
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.