どうも、早期出社中の克兎です。
VisualStudioには、色んなキーワードが登録されています。
デフォルト設定では入力すると青くなるアレです。
よく使うのは基本型の
int、char等や、
for、ifといった文法系
C++の場合は
public、private、public等も馴染みがあると思います。
馴染みの薄いものでは
__int64、__declspec、asm
といったものもありますね。
[1回]
そんな中で、未実装なのか、特に意味を持っていないキーワードも存在します。
そのひとつ、
nullptrを紹介したいと思います。
nullptrはキーワードで存在しながらも、
使用すると、コンパイルエラーが出ます。
どうやらC++上では実装されていないようです。
このキーワード、実は
「
C++/CLI」という言語の中では実装されています。
振る舞いとしては、
・ポインタ型を0でクリアすることができる
・ハンドル型(マネージ型のスマートポインタ)をnull値として扱う
・整数値に代入できない。
WindowsAPIを扱う環境では、
NULLという定数が用意されていますが、
これは、ただの整数の0で、
・ポインタ型を0でクリアすることができる
という振る舞いは再現できますが、
それ以外の振る舞いは再現できません。
実際、nullptrがあれば、ポインタのクリアも見やすくなりますし、
整数用のNULLと使い分ければ、代入箇所で、型の確定がしやすくなります。
というわけで、nullptrを作ってみます。
実装コードは非常に簡単です。
#undef nullptr
struct nullptr
{
template< class T >
operator T*(){ return 0; }
};
typedef nullptr _nullptr;
#define nullptr nullptr();
|
キーワードは全部青文字にしました、真っ青です。
nullptrの再現に必要なのは、
メタ関数という概念です。
通常の関数と違い、実行時に振る舞いを確定させ、かつ、
オブジェクト指向に基づき、計算のカプセル化を行う、関数型のクラスのことです。
この場合nullptrという構造体がそれに当たります。
キャスト演算子のオーバーロードをテンプレートにし、
ポインタとして部分特殊化を行なってやることで、
ポインタに代入すると、0でクリアされ、かつ、他の型との互換性のない構造体が出来上がります。
次に、このまま、nullptrとして扱うには、コンストラクタを利用する必要があるので、
defineを使って、nullptrをキーワード化しています。
念のため、構造体宣言の前段階で、
nullptrをundefしておき
型を利用できるように_nullptrとしてtypedefもしてあります。
ぜひご利用下さい
そ~れ~で~は~('∀`)ノシ
PR
COMMENT