読者です 読者をやめる 読者になる 読者になる

and演算子の短絡評価にはまった話

以下のコードで論理演算でなぜか右の関数funcが呼び出されてない>< return a && func(); ってことになやまされ、とりあえず問題を分解するために auto f = func(); return a && f; としたら正常に動いた。 なんで?って思ってTwitterでつぶやいたら一瞬で反…

C++での継承とオーバーロードの名前解決の問題

以下の様なプログラムを書いたのだがなぜかオーバーロードがうまくいかない... #include<iostream> class Hoge{ public: void func(){ std::cout <<"パラメータなし"<</iostream>

暗黙の型変換を禁止するテンプレートクラス

暗黙の型変換はときおり悩まされる。しかも、コンパイラは警告すら出さない。 先日複数の引数がある関数をつくり、それでint型とbool型を受け取っていた。この場合型が異なるし独自の型を導入しなくてもいいだろうとか思っていたのが間違いだった。int型の変…

オブジェクトからテンプレートパラメータを取り出す

テンプレートクラスのインスタンスからテンプレートパラメータを取り出したいということが思う。そんなとき以下のようにすると取り出せる。 template<typename T,template<typename>class Target> T getType(Target<T>); template<typename T> class Hoge{}; int main(){ Hoge<int> hoge; decltype(getType(hoge</int></typename></t></typename>…

VS2010でテンプレートクラスの初期化子リストでメンバにラムダ式をわたす時の問題

結論から言うとコンパイルできなかった。問題のソースは以下。 class Hoge{ public: template<class T> Hoge(T func){func();} }; template<typename T> class Foo{ public: Foo(): hoge([](){return true;}) {} private: Hoge hoge; }; int main(){ return 0; } なぜだろうと思っ</typename></class>…

std::unordered_mapやstd::mapの比較用のファンクタとしてラムダ式を渡す

やろうとして意外に面倒だった。が、だれも書いていないみたいなので書いておく。より面倒なのはstd::unordered_mapのほうなのでこちらについて主に書く。面倒なのは基本的にテンプレート引数としてファンクタを渡す仕様になっているということ。ラムダ式は…

クラス内にあるtypedefが存在するか調べる

あるクラスにあるtypedefが存在するか否かを調べる方法はないかな? とか悩んでいてTwitterでつぶやいたらフォロワーさんがそれSFINAEでできるよと教えてくれた。SFINAEとは「Substitution Failure Is Not An Error」のことで「置き換えの失敗はエラーになら…

サークルでポインタを教えてきた

僕の所属しているサークルの新入生向けのC++講座(C++を教えるのが最適かという質問はなしの方向で)で先日ポインタを教えてきた。その時にどうやって教えたのかやどういう反応が返ってきたかをメモとして残しておく。 よくある「この教え方がいい」みたいなの…

intとunsigned int のキャスト検証

サークルで以下のようなC++のコード(一部改変。)が話題になった int hoge=-1; if (hoge<=strlen("hoge")){ std::cout<<"Hoge"<

関数で複数の返り値(戻り値)を返すのをラムダ式でする

C++03までは関数で複数の返り値を表現する際は配列を利用するしかありませんでした。ただその場合は返り値専用の配列を利用するので返り値をわかりやすい名前の別の変数に代入するときやそのまま出力して終わりなどという時は若干無駄なことをしてる感じがあ…

C++でTDDを始めてみた。

最近よくユニットテストやらTDDやらの単語をよく聞くようになった。いままでだるいな(LLでは標準でサポートされていることも多いがC++の場合そうではないので)と思いつつしていなかったのだが、こないだ思い切って始めてみることにした。環境の導入やそのと…

Boost Property Tree LibraryでXMLをいじってみた

今作っているRPGのアイテムのデータをXMLで表現しているのですが、それを読み込む部分で何にしようかなと思いBoostを使ってみました。ということでメモも兼ねて記事を書いておきます。パースするXMLは以下のような形式(ある程度簡略化)です。 <ItemList> <Item name="hoge"> <Script>hogehoge.lua</Script></item></itemlist>…

Luaの標準ライブラリをCやC++から呼び出すときの注意(メモ)

luaのみを使っている場合標準ライブラリは特にimportやらincludeやらをしなくていいのであんまり意識しない。んでC++から呼び出したときも同じ感じで特に何も指定せずでできるのかなと思ったらエラーを吐いた。 luaL_openlibs(L); という一行を入れなくては…

&演算子のオーバーロードの罠

予想外のエラーがでて悩んでいました。なぜかオーバーロードしたものではなくデフォルトの自分自身のポインタを返すoperator&が呼ばれてしまう... &演算子に限ったことではなくオーバーロードのどの関数が呼ばれるかという問題であることに気づきました。 エ…

Qt SDKを導入してみた

簡単にC++でGUI作れるフレームワークとかないかなと探していたらQt(キュート)なるものを見つけました。ということで導入してみます。 とりあえずQtの公式ホームページにいき、ダウンロードからインストーラを落とします。僕は開発ではwindowsを使っているの…

暗黙のインターフェースにconstを強要させる

テンプレートで静的ポリモーフィズムを実現するために暗黙のインタフェースを利用します。しかしこれは明示的なインターフェースと違い、引数がconst、あるいはインターフェースがconstメンバ関数かどうかまで通常指定することができません。しかしconstは便…

リストを実装してメモリエディタで遊んでみる。

今回は解説というより半分遊びなので口調がいつもと違うかも。 標準STLばっか使っててデータ構造何一つ実装したことないので双方向リスト(実質単方向だけど)リスト実装してみた。とりあえずソースコード。 //list.h template <class TType> class List{ private: List* Ne</class>…

【メモ】C++でポインタの動的配列

確保するときに悩んだのでもしかしたら需要あるかなと思って書いておく。 ポイントはポインタのポインタにするところとnew hoge*[10]みたいに*を型の後におくところ。最初 new *hoge[10]みたいにしてて上手くいかなかった。あくまでhoge*を10個確保するとい…