2016-02-08

CustomVector2

ちょっと将棋の話でも書こうと思ったのですが、驚きのコメントをいただきましたので、CustomVectorの続きを書きたいと思います。
先日、ながったらしいFor文書くのに飽きたから、簡略化できるようにstd::vectorのラッパークラスを作ったという記事を書きました。が、私がやりたかったことは、すでに実現されているらしく

std::vector< Character* > m_characterlist;
というリストにたくさんのキャラクターが登録されていた場合、
for( Character* p_character : m_characterlist){
 p_character->うんちゃらかんちゃら
}

で頭から尻尾までまわせるようです。びっくりしました。また、autoという便利機能もあるようで、

for(auto p_character : m_characterlist)

でもかまわないようです。Character*のコンテナなんだから、そこの要素を取り出そうとしてる以上、p_characterはCharacter*に決まってんだろということを勝手に判断してくれるらしい?
とはいえ、すでにCustomVectorクラスを使い始めてしまったので、全部std::vectorに書き直すのはめんどくさいし、やっぱりオリジナル機能を取り付けたりはしたいので、このまま使えるようにしたいと思いました。

そこでちょっと調べてみると、どうやらbeginとend関数が用意されているSTLは全てこの形のfor文が使えるようです。
だったら、CustomVectorにもそれを用意してやればいいんだろうと思って、さっそく付け足してみたのですが・・・エラーが出ます。

std::vector< T >::iterator begin(){
 return m_vector.begin();
}

だと、std::vector< T >::iteratorが型として認識されてくれないようなエラーメッセージが出るんですね。
はて? いつもこうやってイテレーター返してるんだけどなと悩みましたが、見よう見まねでこうしてみると、無事に動きました。

template < class T >
class CustomVector {
protected:
 std::vector< T > m_vector;
 typedef typename std::vector< T >::iterator iterator;

public:
 CustomVector(){
 }
 virtual ~CustomVector(){}

 iterator begin(){
  return m_vector.begin();
 }

 iterator end(){
  return m_vector.end();
 }

なぜかはよく分かりませんが
typedef typename std::vector::iterator iterator;
があると、動くようです。私typedefとかtypenameとか使ったことないから何でこうすると動くのかわかんにゃいんだけどね?
まぁ、ぶっちゃけ私のプログラミングスキルなんてその程度だから。
でもまぁ、これで

CustomVector< Character* > m_vector;
for(auto p_character : m_vector){
 p_character->うんちゃらかんちゃら
}

が、動きました。
いやーこのFor文便利すぎてやばいですね。タイムワープして来た古代人みたいに驚いちゃいましたよ。
コメントくれた方は、本当にありがとうございました。

コメント

http://www.fides.dti.ne.jp/~oka-t/cpplab-template-4.html

たびたびコメントありがとうございます。

typename std::vector<T>::iterator begin(){
  return m_vector.begin();
}

という書き方が出来るんですね。
ただちょっといただいた資料がまだ飲み込めないので、型名を明示する必要がまた発生したときにでも、もうちょっと調べてみようかと思います。

Tが何者か分からない時点ではT::value_typeが型かどうか分からないというのは納得できるんですが、std::vector<T>::iteratorに関しては、Tが何者であろうとstd::vectorのiteratorのことだと分かるんじゃないかという気がするのです。
記事の最後の部分を見た感じ、もしかしたらSTLでのiteratorの扱いがそういう風になってるのかなぁという感じではあるんですが。

Effective Modern C++

検索してみた感じだと、書籍のご紹介ですかね?
私が読むには本格的過ぎる気がするので、余裕のあるときにでも・・・。

楽をしたいならgof本と合わせて読むべきです。失礼

GOF本というとあれですよね、デザインパターンの。
何年か前、C++を始めた際にデザインパターンについてはいくつかのサイトで読みましたが・・・難しいんですよね。
今ならまた違った視点で読めるようになってるのかもしれませんが、なかなか・・・。

コメントの投稿


管理者にだけ表示を許可する

Copyright (C) 旅の雲. All rights reserved. Template by Underground