プログラムメモ

Strategyパターンの実装

非スタティックなメンバ関数ポインタを使う方法を試してみた。 main.hpp #include <boost/lambda/bind.hpp> #include <boost/function.hpp> #include <iostream> class CSample { public: void fSetFunc(int Index); void fFunc1(){std::cout << "fFunc1" << std::endl;} void fFunc2(){std::cout << "fFunc2" << s</iostream></boost/function.hpp></boost/lambda/bind.hpp>…

boost::range

stlのlist等、ランダムアクセスイテレータが使えないコンテナは添え字アクセスもat()によるアクセスもできなくて不便。なので、boost::rangeでこんなのを作ってみた。 #include <stdexcept> #include <boost/range.hpp> template <typename RangeType> typename boost::range_reference<RangeType>::type GetElementAt(Ra</rangetype></typename></boost/range.hpp></stdexcept>…

初期化リストの初期化順

初期化リストでのメンバ変数の初期化は宣言順に行われるらしい。 #include <iostream> class CTest{ public: int mValue1; int mValue2; CTest():mValue1(10),mValue2(mValue1+10){} }; int main() { using namespace std; CTest Test; cout << Test.mValue2 << ends; </iostream>…

メモ

queue(キュー)と打ってるとueを余分に打ってる感がしてテンションが微妙にあがる。

boost::serialization

製作中のゲームのセーブ、ロードをboost::serializationを使って実装中。 クラスに余計な記述が増える。 メンバを増やすたびに更新しないといけない。 って事で、実装はセーブ、ロードで扱うデータが出揃ってからの方がいい気がしてきた。 コピーコンストラ…

pImplイディオム

コンパイル依存性を切るために多用しているんだけど、 pImplイディオムを使っていて微妙に気持ち悪いのが int fGetValue() const{ return pImpl->mValue; } とかconstなメンバ関数が全然constじゃない事。 int fGetValue() const { pImpl->mValue = 100; ret…

馬鹿だ

http://d.hatena.ne.jp/srzw0326/20080113/1200237532良く考えたら、自分自身のコンストラクタ内だろうと何だろうとコンストラクタ 呼べば、一時オブジェクトが生成されるに決まってるよね……。 ボケてたよ!恥ずかしいなぁ。穴があったら入りたい。 穴に入っ…

コンストラクタの中でオーバーロードされた別のコンストラクタを呼んではいけない。

http://www.biwa.ne.jp/~chu2/laboratory/cpp.html#cpp09 真っ先にはまりそうな罠だけど今まで知らなかった! そしてついさっきはまった!

コメントではてな記法が使えない様なので日記にて。 ADL namespace srzw { struct Bar { int value_; }; void foo(Bar& bar){} void foo(){} } int main() { srzw::Bar bar; foo(bar); // 省略可能 srzw::foo(); // 省略するとエラー return 0; } わー、本当…

http://d.hatena.ne.jp/uskz/20071207/p2std名前空間にオーバーロードは作成してはいけない、と。 boost::rangeを使うと幸せになれるらしい、と。 template<typename Range, typename F> typename boost::range_iterator<Range>::type remove_if(Range& r, F f){ return remove_if(boost::begin(</range></typename>…

remove_ifのオーバーロード

find_ifやremove_ifはコンテナ全体に対して行う場合が多いので、 beginとendを指定するのは冗長な場合がほとんどなのです。 vector<Test>::iterator End = remove_if(Tests.begin(), Tests.end(), bind(IsSameType, _1, TYPE_A)); Tests.erase(End, Tests.end()); </test>…

BOOST_FOREACH

boost1.34.1から加わったBOOST_FOREACHstd::for_eachよりも自然に記述できて大変便利なのでstdafx.hに #include <boost/foreach.hpp> #define foreach BOOST_FOREACH として愛用中。で、stlのmapをforeachでまわそうとして using namespace std; map<string,int> Map; Map.insert( pair<string,int>("XBO</string,int></string,int></boost/foreach.hpp>…

関数内関数その2

前回触れた関数内関数、引数をとる叙述関数の場合はbind使って 渡す事になるんだけど、ローカルの関数オブジェクトだとVC2005で コンパイルエラーに。ローカルメンバ関数だと通るのでとりあえず 問題はないんだけど、なんでだろう?? #include <stdio.h> #include <vector> #</vector></stdio.h>…

関数内関数

そういえばC++で関数内に関数が定義できたんだった。 STLのアルゴリズムで一度しか使わないような叙述関数を定義するときに便利そう。 ただし関数オブジェクト版はCygwin上のGCC3.4.4でコンパイルエラーになった。 (VC2005では両方OK) #include <stdio.h> #include <vector></vector></stdio.h>…