投稿

12月, 2019の投稿を表示しています

C++11の機能 (scoped enum, 可変長テンプレート, usingによる型エイリアス)

C++11の機能を紹介するシリーズ第五弾です。 今回はscoped enum, 可変長テンプレート, usingによる型エイリアスについて紹介していきます。 scoped enum Cからあるenumは中で定義した名前がそのまま垂れ流しになってしまっていました。これにより、すでに使われている名前とかぶるなどの問題がありました。 また、enumは整数型への暗黙的な型変換ができましたが、scoped enumは明示的に型変換を行わない限り整数型に代入することはできません。 enum class RgbColor { Red, Green, Blue, }; // 使う RgbColor rc = RgbColor::Red; int irc = static_cast<int>(rc); 可変長テンプレート C++11より前のテンプレートはテンプレート引数を可変長にすることができませんでした。そのため、最小1から最大10の任意の個数のテンプレート引数を受け取るには10個の関数テンプレートなどを書く必要がありました。しかし、この方法では最大の個数が10に制限されてしまいますし、何よりもテンプレートで省略可能であるはずのことが全く省略できていません。 そこで、C++11では0個以上の任意の個数のテンプレート引数を受けることができる可変長テンプレートが追加されました。 例として、引数に取った値をスペース区切りで標準出力に出力するコードを以下に示します。 template<class Arg> void print(Arg arg) { std::cout<<arg<<std::endl; } template<class Arg, class... Args> void print(Arg arg, Args... args) { std::cout<<arg<<" "; print(args...); } この例で出てくるclass...が可変長テンプレートです。テンプレート引数の型(?)の部分はテンプレートで使えるものであれば何でも使えます。この例ではclassを使っていますが、intで

自作OSをやってみて良かったこと

自作OSアドベントカレンダー2019 11日目 (12/11)です。 アドベントカレンダーには初めて参加させていただきます、拙い文章ですが温かい目で見守っていただけると幸いです。 ここでは、自作OSに挑戦してみて良かったなと思ったことを書いていきたいと思います。 自分はx86でBIOS(レガシーBIOS)とUEFI(x64)から起動するタイプを途中まで(というか割と序盤で脱線していきました)作った程度です。 知識が増える 自作OSをやってみたことで、いるか要らないかはさておき知識が増えました。 例えば、OSが起動するまでに起きていることや呼出規約、UEFIとBIOS、アセンブリとインラインアセンブリとかとか... 普通に生きていれば、あんまり気にすることのなかったことでも、OSの自作に挑戦したことで、自分で調べたり、作ってみたりして色々知ることができました。 OSは現代的なシステムの基底となっているシステムなので、これを知っておくと大分能力の幅が大きくなると思います。実際に色々役に立っています。 OSの偉大さがわかる 自作OSでは、当たり前ですがOSの力を借りれません。一番基本(?)のデバッグ方法のprintfデバッグすらできません。 そういう環境を経験すると意外とOSのお世話になってるなと実感します。 OSのすごさを感じた点としては、Linuxのプロセススケジューラの実装があります。これを知ったとき「なにそれ、めっちゃ頭いいじゃん!!」とか思いました。自分が実装したら普通にキューに突っ込んで「優先度?なにそれ美味しいの?」みたいな実装になりかねないのでかなり感動しました。 プログラミング言語に関する能力が向上する 自分はCとC++でOSを書いてみたことがありますが、標準ライブラリがないので(newlibとか使えば良いのでしょうが)、必要な機能を作ることになります。 簡単なものならstrcmpやstrcpyなどから、printfのような作る前だと、「これどう作るんだ...」となる関数まで色々作れます。(競プロとは違うパズルみたいな楽しさがあって好きです) 普通にアプリを作っているときには使わなかったり気づかなかったりした機能にも気づけたりしてとてもおもしろいと思います。 自分はここで自作OSそ