忍者ブログ

神戸電子専門学校ゲームソフト学科の生徒が運営するGESのブログです。

   

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

nullptrの実装

どうも、早期出社中の克兎です。

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

NAME
TITLE
MAIL(非公開)
URL
EMOJI
Vodafone絵文字 i-mode絵文字 Ezweb絵文字
COMMENT
PASS(コメント編集に必須です)
SECRET
管理人のみ閲覧できます

ブログ内検索

最新コメント

[01/29 人面犬]
[10/01 8ch]
[09/12 uncle]
[09/10 某卒業生]
[06/07 uncle]

カレンダー

03 2024/04 05
S M T W T F S
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30

テスト

Copyright ©  -- GESブログ --  All Rights Reserved
Design by CriCri / Photo by Geralt / powered by NINJA TOOLS / 忍者ブログ / [PR]