C++

1を左シフトした時の10進数と16進数の対応表

C++

だいたいの値をいつも忘れるのでメモ代わりに対応表を作ってみた。 | 1 << 0 | 1 | 0x00000001 | | 1 << 1 | 2 | 0x00000002 | | 1 << 2 | 4 | 0x00000004 | | 1 << 3 | 8 | 0x00000008 | | 1 << 4 | 16 | 0x00000010 | | 1 << 5 | 32 | 0x00000020 | | 1 <<…

Singletonクラスにauto_ptrを使うのは案外難しい

C++

またまたSingletonクラスの話です。昨日の続きです。自動でデストラクタを呼ばせる目的なら、自前でクラスを作るよりもauto_ptrを使った方が意図が伝わりやすいというコメントを頂き、確かにそうだなと思ったのでauto_ptrを使ってもう一度Singletonクラスを…

Singletonの話あれこれ

C++

さてここ最近ずっとSingletonについてあれこれ学んでる最中なのですが、なにやらまたしてもC++の深遠を覗いてしまった感があります。Singleton デザインパターンとかポインタとか - 野良C++erの雑記帳 シングルトンまとめ - Togetterこちらの記事で僕の疑問…

Singletonをテンプレート化する

C++

Singletonクラスの続きです。今回はSingletonクラスをテンプレート化して簡単に定義できるようにしてみたいと思います。 #include <iostream> using namespace std; template<class T> class Singleton { private: class Auto { public: T* m_instance; Auto() : m_instance(0){</class></iostream>…

Singletonクラスの内部で持つポインタの話

C++

先日の記事でコメントを頂いたのでちょっとSingletonクラスの内部で持つポインタについて自分なりに色々調べてみました。まず下記のようなシンプルなSingletonクラスを考えます。 #include <iostream> using namespace std; class Foo { private: static Foo* m_instan</iostream>…

SingletonじゃないクラスをSingleton化する方法を考える

C++

もともとSingletonではない元クラスをSingletonとして扱う方法がないかを考えてみる。条件として, 元クラスは引数無しのコンストラクタを呼べなくてはならない。また、当然のことながら元クラス単体を定義したりnewしたりできるということはここでは問題とし…

const有り無し両方のメンバ関数を用意する理由

C++

参考書等をを見ると、例えば戻り値にメンバ変数への参照を返すようなメンバ関数を用意する場合、const有りとconst無しの両方を用意しています。 #include <iostream> using namespace std; class Foo { int m_num[10]; public: Foo() {} // const無し版 int& operator[</iostream>…

privateなメンバ変数にアクセスする

C++

たとえメンバ変数をprivateにしていたとしてもポインタを経由すればアクセスできてしまう。 #include <iostream> using std::cout; using std::endl; class Foo { private: int num1; int num2; public: void output () { cout << num1+num2 << endl; } }; int main ()</iostream>…

ostringstreamクラス

C++

文字の加工にはostringstreamが便利。 #include <iostream> #include <sstream> using std::cout; using std::endl; int main () { std::ostringstream ss; int i = 10; ss << "foo" << i << ".txt"; cout << ss.str() << endl; return 0; } $ main foo10.txtちなみにss.str()の</sstream></iostream>…

初歩的なミス

C++

やっちまった。 #include <iostream> using std::cout; using std::endl; using std::cin; void input(char* c) { cin >> c; } int main () { while (true) { char c; input(&c); cout << c << endl; if ( c == 'e' ) break; } return 0; } このコード。一見うまくいく</iostream>…

一次元配列を二次元配列っぽく扱うクラスの実装

C++

前回の記事では以下のようにして一次元配列を扱っていました。 一次元配列としてnewで確保した配列を二次元配列っぽく扱う。 #include <iostream> using std::cout; using std::endl; const int ARRAY_X = 10; const int ARRAY_Y = 5; int main () { int* array = new </iostream>…

一次元配列を二次元配列っぽく扱う

C++

一次元配列としてnewで確保した配列を二次元配列っぽく扱う。 #include <iostream> using std::cout; using std::endl; const int ARRAY_X = 10; const int ARRAY_Y = 5; int main () { int* array = new int[ARRAY_X * ARRAY_Y]; for(int y=0;y</iostream>

型変換演算子を使って戻り値のオーバーロード風を実現

C++テンプレートテクニック 9-3 戻り値のみでは通常オーバーロードはできません。 #include <iostream> using std::cout; using std::endl; class CClassA {}; class CClassB {}; CClassA foo() { return CClassA(); } CClassB foo() { return CClassB(); } int main (</iostream>…

演算子のオーバーロードとグローバルな演算子のオーバーロード

C++

#include <iostream> using std::cout; using std::endl; class CClass { int m_num; public: CClass(int num) : m_num(num) {} bool operator==(const CClass& obj) { return m_num == obj.m_num; } }; int main () { CClass obj1(1); CClass obj2(1); cout << (obj1 </iostream>…

CRTPを用いて静的な多態性を実現する

C++テンプレートテクニック 8-1 自分自身をテンプレート指定したものを継承するというぱっと聞くと凄く良く分からないお話。見たほうが早い。 #include <iostream> using std::cout; using std::endl; template<class T> class CBase { public: void foo () { static_cast<T&>(*this</t&></class></iostream>…

boost::functionの話

C++テンプレートテクニック 7-3 boost::functionの話が出てきました。言ってしまえば関数ポインタや関数オブジェクトが渡せるオブジェクトなんですが、それを実現するための実装が凄く難しい。とりあえず難易度が高いので関数ポインタだけ受け取るクラスをち…

カスタム削除子

C++テンプレートテクニック 7-3 スマートポインタのメモリ解放処理を関数ポインタ(もしくは関数オブジェクト)を渡すことによって専用の解放処理を実行するという話。以前DirectX用のスマートポインタを作ったことがあるので、今回はそれにカスタム削除子を追…

boost::anyを実装してみる

C++テンプレートテクニック 7-3 boost::anyの話が出てきました。なんでも格納できるクラスです。とりあえず本を参考にしながら出来る範囲内で実装してみます。 #include <iostream> using std::cout; using std::endl; class any { private: // 非テンプレート基本クラ</iostream>…

仮想関数テーブル版Type Erasure

C++テンプレートテクニック 7-2 仮想関数テーブルの話が出てきました。話だけは知っていたのですが、実際のこんな感じという実装を見てイメージが湧きました。しかしdrawひとつ呼ぶのにこれだけコードが必要なのもちょっとどうなのかなぁという感じもします…

Type Erasure

C++テンプレートテクニック 7-1 まずは何でも保存できるvoid*型を利用したテクニックの話。ただしdeleteするときに元の型のデストラクタが呼ばれないのでこのままじゃダメ。

非テンプレート基本クラスとテンプレート派生クラス

C++テンプレートテクニック 7-2 void*を利用したType Erasureではdeleteする際に元クラスのデストラクタが呼ばれないという問題がありました。非テンプレート基本クラスとテンプレート派生クラスを利用すればこの問題が解決します。 #include <iostream> using std::co</iostream>…

enable_ifメタ関数

C++テンプレートテクニック 5-4 Boostにあるenable_ifというメタ関数の話。これはうまい仕組みだなぁ。

型特性メタ関数

C++テンプレートテクニック 5-3 特殊化を利用して型をチェックするメタ関数を作る #include <iostream> using std::cout; using std::endl; template<class T> struct is_pointer { static const bool value = false; }; template<class T> struct is_pointer< T* > { static const bool </class></class></iostream>…

参照配列の特殊化と型推論

C++

C++テンプレートテクニックを読んでいて見慣れない構文が出てきた template<class T,std::size_t N> struct range_iterator< T[N] > { typedef T* type; }; このT[N]で特殊化してる部分が良く分からなかったので自分なりに色々調査してみた。まずはどういうときに呼ばれるのか試して</class>…

Range-base STL アルゴリズム

C++テンプレートテクニック 5-2 ここの話はいろいろと面白いですね。beginやendを汎用化して呼び分ける。コードも簡素になるし素晴らしいです。ただし、endの定義が以下のように参照の配列を受け取る前提になっているので template<class T,std::size_t N> T* end(T (&ar)[N]) { ret</class>…

継承を利用したポリシー

C++テンプレートテクニック 6-4 http://d.hatena.ne.jp/pknight/20100323/1269358966続き。お次は継承を利用したポリシーです。 #include <iostream> using std::cout; using std::endl; template<class Policy> class CClass : public Policy { public: void func () { this->foo();</class></iostream>…

インスタンスメンバを利用したポリシー

C++テンプレートテクニック 6-4 前回の記事ではstaticメンバ関数を使用したポリシークラスの実装になっていました。今回はインスタンスメンバを使用した場合のポリシーについてです。 #include <iostream> using std::cout; using std::endl; template<class Policy> class CClass { </class></iostream>…

ポリシー

C++テンプレートテクニック 6-1 またしても新しい単語が登場。ポリシー。要約すると同じ関数を持つ別々のクラスを指定できるようにするテンプレートといった感じでしょうか。 #include <iostream> using std::cout; using std::endl; template<class T> void func () { T::foo()</class></iostream>…

SFINAE

C++テンプレートテクニック 5-1 SFINAEという言葉が出てきました。テンプレートのインスタンス化に失敗した場合に、即エラーにするわけではなく、一旦オーバーロードの候補から外して別のテンプレートをインスタンス化する、という感じですかね。前回の記事…

劣化版iterator_traitsを実装してみる

前々回の記事で型変換について学習したのでVector等も渡せる配列操作関数を作成する - (void*)Pないとで出てきたiterator_traitsを実装してみる。 #include <iostream> #include <vector> using std::cout; using std::endl; template<class T> struct types { typedef typename T::valu</class></vector></iostream>…