ユーザー定義リテラル(user defined literals)

C++11では、「ユーザー定義リテラル(user defined literals)」機能により、数字や文字列などのリテラルにサフィックスを付けられます。

OpenSiv3Dでは、MathConstants.hppで_pi、_degユーザー定義リテラルを実装していて、double a = 2.0_pi;のような記述ができます。

実装してみる

実装方法は演算子のオーバーロードと同じです。コード量も少ないので、https://cpprefjp.github.io/lang/cpp11/user_defined_literals.html などを参考に実装できます。

 

 

 

C++11/14のalgorithmとfunctionalで、階乗やフィボナッチ数列を作る

C++11/14では、algorithmヘッダーで関数型APIが用意され、functionalヘッダーでラムダ記法も可能です。今日は他の言語ではmap関数として用意されているtransform関数を使ったり、階乗やフィボナッチ数列を作ってみました。

ラムダ式内で再帰的に関数を使う場合は、型推論のautoで作るとうまくいかないようです。function<int(int)> fのように明示すれば問題なく実行できます。またキャプチャーも参照[&]にする必要があります。

 

VisualStudio2017でBoost1.64.0を使う方法

Boost1.64.0は、シグナルというイベント通知やObserverパターンと同様な機能があるので、VisualStudio2017で使ってみました。

Boostの基本的な機能はヘッダーに実装が書かれているため、ヘッダーを読み込むだけで使えますが、シグナルは、Boostをビルドする必要がありました。ですがVisualStudio2017の開発者プロンプトで問題なくビルドできました。

Boostのビルド

bootstrap.batの実行

「Developer Command Prompt for VS 2017」を検索し、コンソール版のコンパイル環境を起動します。BoostをZIP展開したディレクトリーに移動して、bootstrap.batを実行します。これでビルドするためのb2.exeが作成されます。

b2.exeを実行してビルドする

ビルドが成功すると、stage\lib配下に、libファイルが作成されます。また、以下のようにインクルードバスとライブラリーパスの設定方法が表示されるので、VisualStudio2017で設定します。

 

サンプルソースコード

boostjp.github.ioを例にシグナルを使うサンプルを実行してみました。

 

これで自分でObserverパターンを書かずに、実績のある通知機能を使えるようになりました。

 

 

OpenSiv3DでNatureOfCodeのRepellerを実装してみました。

書籍NatureOfCodeで、パーティクルシステムや重力加速度などを学んで、いちから実装できるようになったので、いつも使っているp5.jsではなく、気になっていたC++のOpenSiv3Dで実装してみました。C++はstd::vectorや値渡し時のコピーコンストラクタの動作などを学びながらなので、いろいろ修正する箇所は多いですが、まずは動かせたので良かったです。

ソースコード

 

VSCodeでVisualStudio2017のcl.exeを使う場合、VsDevCmd.batとVSCMD_START_DIRに注意

Visual Studio 2017では、コマンドプロンプトでcl.exeなどの開発ツールを呼び出す方法がVsDevCmd.batに変わりました。このバッチファイルは初期設定でディレクトリー移動をしてしまうので、現在のディレクトリーから移動したくない場合は、環境変数VSCMD_START_DIRを使います。

set “VSCMD_START_DIR=%CD%”

https://developercommunity.visualstudio.com/content/problem/26780/vsdevcmdbat-changes-the-current-working-directory.html

環境構築

vscodeをインストール後、拡張機能cpptoolsをインストールします。https://code.visualstudio.com/docs/languages/cpp などを参考に、c_cpp_properties.jsonとtasks.jsonを.vscodeディレクトリーに用意します。以下build.batは、プロジェクトのルートディレクトリーに配置します。c_cpp_properties.jsonは自動生成です。

build.bat

.vscode/tasks.json

tasks.jsonは、”command”をbuild.batに書き直してそれ以外は、デフォルトのままです。argsは使ってません。

vscodeの設定ファイルは、.vscode内、build.batはルートディレクトリー

これで、Ctrl+Shift+Bで、コンパイルできるようになります。

まとめ

ひとまず、VisualStudio2017がインストールされた環境で、vscodeでもC/C++プロジェクトを開発できるようにしました。また、この設定により、Ctrl+Shift+Bでビルドできるようになりました。ただし現時点では、かなり手順が必要で面倒です。cl.exeにこだわる必要がない場合は、Bash on Windowsか、単純にエディターとコマンドプロンプトでもよさそうです。