とくにあぶなくないRiSKのブログ

危ないRiSKのブログだったかもしれない。本当はRiSKだけどググラビリティとか取得できるIDの都合でsscriskも使ったり。

for しーぷらぷらー

C++よりもC#でゲームを作るとよい8の理由と、悪いほうの8つの理由 - 【長剣は】最強武器候補【鈍器です】
追記:元記事をきっかけとして,C++ でどこまでできるか私が知っている範囲で紹介しているエントリです。言語・ライブラリの良し悪しとか,ゲーム作りにふさわしいか否かではなく「それC++でできるよ!」のノリで。

型 struct/class

C++の場合、enumで宣言されたものはグローバルなシンボルになりますが、C#では型名を必要とするためにローカルなシンボルになります。

// C++
enum SWORD
{
    SWORD_LONG,
    SWORD_SHORT,
};

型名を必要とするならこうかなぁ。

struct SWORD{enum
{
    LONG,
    SHORT
};};

SWORD::LONG; // 型名必要。

lexical_cast

"hello"+500 でもエラーにならず、"hello500" が返されます。

lexical_cast を使えばこんな感じ。

#include<iostream>
#include<boost/lexical_cast.hpp>
using namespace std; using namespace boost;
int main(){
 // コンパイルエラーにならず "hello500" が返されます。
 // 危険なことをしても例外を投げてバイナリを終わらせてくれる
 cout << "hello" + lexical_cast<string>(500) << endl;
}

shared_ptr

いくらnewしても、それなりにdeleteしてくれます。

そういうスマートポインタを使えば C++ でもできるよ!

#include<boost/shared_ptr.hpp>
using namespace boost;
struct large{char a[64 * 1024 * 1024];};
int main(){
 for(int i = 0; i < 128; ++i)
  shared_ptr<large> p(new large); // new しまくりだぜー!ひゃっはー!
}

any

6、型名のタイプを怠惰にできる

any で近いことできるよ!

#include<boost/any.hpp>
using namespace std; using namespace boost;
namespace MyGame{namespace Lib{struct File{struct Save{struct ver1_3{};};};}}
int main(){
 // C++にはanyという名前の型っぽい何かがあります。
 any save(new MyGame::Lib::File::Save::ver1_3());
}

ソースファイルほぼ不要

8、ヘッダファイルを書かなくて良い

C++ は main を含むソースファイル以外,ヘッダだけ書いてればいいです。ファイル構成は任意なので。

コンパイル環境

悪いところ1、動く環境が100%ではない

C++ ではコンパイル環境の方が問題。
Boost Librariesというのが必要になります。これはインストールされていなければいけません。