ポインタ型

ことC++に関しては、ポインタは頭が痛い。特にジェネリックな実装をする場合には。


例えば、あるクラスを引数で受け取り、それをtemplateで型を抽象化する場合、その型が、ポインタ型なのか、実体型なのかで実装が違う。


template
void foo(T val) {
// Tがポインタ型なら、
// val->bar();
// Tが実体型なら、
// val.bar();
}

以下のような解決策を思いつくかもしれない。


tempalte
void foo(T val) {
// Tを実体型として実装
// val.bar();
}

// 関数オーバーロード
template
void foo(T* val) {
// valは、Tのポインタ型の変数
// val->bar();
}

しかし、この場合、同じロジックの実装を2回かかなくてはならない。つまり、問題点は、ポインタ型と実体型を同一扱いできないことである。


このスマートな解決策が、C#のやり方である。つまり、ポインタ型(参照型)と実体型(値型)のオブジェクトを同一扱いできる。ポイントは以下である。


  • Tの型が、参照型であっても、値型であっても、val.bar()のように記述できる
  • 参照型と値型は、実行時にプログラムが判断してくれる


C++では、実行スピード最優先な言語仕様なため記述の柔軟性を犠牲にしているが、業界や使用目的によるが、もはやその考えはどうなのだろうと思う。


次の仕様、C++0xは、C++09らしいので、C++がさらに使いやすくなるのは、対応コンパイラの出現を考慮に入れると、5年後…。C++が不人気は、さらに進むと思われる。