ポインタ型
こと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++が不人気は、さらに進むと思われる。