2010年6月15日

C++のコンテナクラスにポインタを突っ込んで嵌ったという情けない話

std::listなどのコンテナは、値を検索する際に要素の==演算子を使用します。なので==演算子をオーバーロードしておけば同じかどうかの判定を定義することが出来ます。 ところが、コンテナにポインタをつっこんだ場合は、型の==演算子ではなく、型へのポインタ型の==演算子です。型の==演算子をオーバーロードしていたとしても、呼ばれません。 「そんなときはどうすればいいのダレカタスケテー」と呟いたら、皆さんに助けていただきました。 続きを読む
3
Hirohito Kato ⌘ @hkato193

C++ で、型同士の比較のオーバーロードはできるのは分かったけれど(bool hoge::operator==(const hoge& a)) 、型のポインタ同士を比較するときはどうやってオーバーロードするんだろう・・・

2010-06-15 10:47:14
Hirohito Kato ⌘ @hkato193

リストコンテナにポインタを突っ込んだとき、検索させるときは==を使うわけで、でもその比較はポインタではなくその先を見るんだよね、多分。そのときに、呼ばれる演算子をオーバーロードするには、どう定義したらいいのか調べ中

2010-06-15 10:51:03
Akira Takahashi @cpp_akira

必要ないのでは RT @hkato193: C++ で、型同士の比較のオーバーロードはできるのは分かったけれど(bool hoge::operator==(const hoge& a)) 、型のポインタ同士を比較するときはどうやってオーバーロードするんだろう・・・

2010-06-15 10:56:24
にゃおきゃっと @nyaocat

@hkato193 std::listにポインタ突っ込んでも比較ではポインタの先は見ませんよ

2010-06-15 11:00:00
にゃおきゃっと @nyaocat

……見ないよね?まさかポインタ型に対しては特殊化されてて……って話聞いたことないし

2010-06-15 11:01:47
にゃおきゃっと @nyaocat

実態が複数作られるのを避けるためにvoid*で保持して云々ってのは聞いたことがあるけど

2010-06-15 11:03:04
Hirohito Kato ⌘ @hkato193

@nyaocat @cpp_akira ありがとうございます!お恥ずかしいかぎりですが、仰るところのstd::listにポインタを突っ込んで、その中味を比較しようとしてました。こういうときにはどうしていらっしゃるのでしょう?もし良ければご意見を伺いたく。

2010-06-15 11:08:00
Hirohito Kato ⌘ @hkato193

とりあえず、全部舐める処理を載せた。問題はこれから。

2010-06-15 11:09:42
Hirohito Kato ⌘ @hkato193

コンテナにポインタを突っ込むという発想が間違っているのかなあ。

2010-06-15 11:10:54
Akira Takahashi @cpp_akira

@hkato193 んー、ポインタをラップした型を作って、ポインタの先を比較する演算子を定義するとかそんな感じかなぁ・・・

2010-06-15 11:12:08
にゃおきゃっと @nyaocat

ポインタを突っ込んでその先の比較……って自分で書くしかないのかなぁ。なんかあった気がするからごにょごにょ調べてみよう

2010-06-15 11:13:45
Hirohito Kato ⌘ @hkato193

そうなのですね。…察するに、ポインタをコンテナに突っ込むこと自体があまりないですか? RT @cpp_akira: @hkato193 んー、ポインタをラップした型を作って、ポインタの先を比較する演算子を定義するとかそんな感じかなぁ・・・

2010-06-15 11:14:43
にゃおきゃっと @nyaocat

ポインターをコンテナに突っ込むのはよくやるにゃー。多態したいし

2010-06-15 11:16:58
でちまるさん(実際かわいい) @decimalbloat

よく分からんけど比較用のpredicateを使うとかじゃいけないんだろうか

2010-06-15 11:17:12
Akira Takahashi @cpp_akira

@hkato193 今になって元の動機( http://twitter.com/hkato193/statuses/16192523521 )を見ましたが、std::find_ifでポインタの先を比較する関数オブジェクトを指定すればよさげです。

2010-06-15 11:19:25
Akira Takahashi @cpp_akira

@hkato193 (スマート)ポインタをコンテナに入れることはもちろんありますが、ポインタの先の比較が必要になったことは今のところないですね。

2010-06-15 11:20:51
Hirohito Kato ⌘ @hkato193

対象2つともを引数で型指定できるようにするためでしょうか? RT @decimalbloat: よく分からんけど比較用のpredicateを使うとかじゃいけないんだろうか

2010-06-15 11:21:36
にゃおきゃっと @nyaocat

ラムダ式でも充分いけそう

2010-06-15 11:22:31
Hirohito Kato ⌘ @hkato193

ありがとうございます!まず、メモメモ。 RT @cpp_akira: @hkato193 今になって元の動機( http://bit.ly/coxzjM )を見ましたが、std::find_ifでポインタの先を比較する関数オブジェクトを指定すればよさげです。

2010-06-15 11:22:45
Hirohito Kato ⌘ @hkato193

@cpp_akira そうなのですね。必要にならない設計ができるよう、今後意識してみます。ありがとうございます!!

2010-06-15 11:24:09
Hirohito Kato ⌘ @hkato193

@nyaocat ありがとうございます。視野が広がりました。

2010-06-15 11:24:58
にゃおきゃっと @nyaocat

そういえばboost::lambdaの方がなんかすっきりしてて好きだからC++0xで標準入りしたラムダ式を全然知らない。

2010-06-15 11:25:52
Akira Takahashi @cpp_akira

boost::lambdaはメンバ関数が・・・

2010-06-15 11:27:17
にゃおきゃっと @nyaocat

@hkato193 したい事とは違うかもしれませんが、ポインタをコンテナに突っ込むならば boost::ptr_container も便利ですよー http://www.kmonos.net/alang/boost/classes/pointer_container.html

2010-06-15 11:27:20
残りを読む(7)

コメント