namespaceのエイリアスでちょっと気をつけること
コードを書いていて少し詰まった
#include <iostream> namespace A { namespace B { void f() { std::cout << "called f" << std::endl; } } void g() { //何かしらの処理 } }
こんなコードを書き、gはA::gとして呼び出したいが、fはB::fとして呼び出したい、みたいな事になった。
こういうときusing namespace A;はダメだ、using namespace A::B;も使えない。
そこでこんな2つのコードを書いた。
using B = A::B; using namespace B = A::B;
しかしこれはコンパイルエラーになる。どうやらusingでのエイリアスはnamespaceに対してはできないらしい。
ではnamespaceをエイリアスするにはどうすればいいかというと
namespace B = A::B;
のようにすれば良い。
しかしこれはどうもわかりにくい気がするなといった次第。
singletonとfriendのお話
Twitterでちょっと話してたsingletonクラスとfriendのどっちを使うか的な話の自分的まとめ。
どういう話
ユーザー(≠ソフトウェアエンドユーザー)に複数作らせたくないリソースを、singletonパターンで管理するのと、メンバをstatic、関数をfriendに分けるのどっちを使おうか的な話です。
というわけでとりあえず双方の適当なコードを書いてみる。
singleton
class Singleton final { public: static int getA() { return a; } static void setA(int a_) { a = a_; } private: static int a; } int Singleton::a = 5; int main() { Singleton::getA(); //呼び出し }
friend混ぜ記法
class Hoge final { public: friend int getA() { return a; } friend void setA(int a_) { a = a_; } private: static int a; } int Hoge::a = 5; int main() { getA(); //呼び出し }
これを見てみると、classの定義では関数定義の最初にstaticがつくかfriendがつくか以外の違いがなさそう。
でもmain内を見てみると、その2つの性質の違いで関数の呼び出し方が変わってる。friendは「特定のclassのメンバを扱える外部関数」なので、呼び出しは普通の関数と同じようにできる。
この違いが意外と大きい。
僕も最初singleton使ってたんだけど、一番の悩みが「staticなメンバを参照したいだけなのに、必ずclassの中に入れる必要があること」だった。
実装の都合上そうなっているだけなのに、ユーザーが関数を呼び出すときにclass名を書く必要があるのってスマートじゃない感あるから的な考え。
そこで最近、実装をfriendにしてみたら、ユーザー側からは全く意識せず、グローバル空間も汚さないようにstaticな変数を参照できるようになった。
それまではfriendなんとなく毛嫌いしてたんだけど、こういう用途ならバンバン使って良さそう。
ただ、やたらめったらfriendを使うのも危ないし、staticメンバ関数はそれはそれで使うべき局面がある気がするのでその辺しっかり使い分けていきたい。終わり。
「ゲームを動かす数学・物理」を購入したお話
経緯
昨日ヤボ用ついでに本屋に立ち寄って適当な技術書を探していたところ、「ゲームを動かす数学・物理」を見つけた。
この本、Twitterで良い評判を聞いていた「ゲームを動かす技術と発想」の著者の新しい本みたいなので手にとって見たところ、ゲームプログラムに関する基礎を学べる感じの本だった。
この本。書き方が丁寧で分かりやすかったし、僕はゲーム制作ってのがものっそい苦手なので、半分衝動買い的な感じで買ってしまった。
読んだ感想
だいたいパラパラめくった時の感じのままのイメージ。
めっちゃ丁寧(若干うるさいくらい)に基礎から書いているので、わかりにくい場所がほとんど無かった。
ただサンプルがC言語なので、最低限のC言語の知識がないと厳しいかもしれない。
あとC言語なせいでclassが無かったり乱数生成にrand使ってたりして、普段C++書いてる身としてはムウってなった。
でもそれを差し引いても、ゲームを作る時の基礎が大体書いてあったので、結構おすすめです。これからゲーム作る後輩に勧めたいレベル。
あと、この記事書いてる途中に発行日見たら9/5だったので、意図せず発売日買いになっていた。
鈍器コレクション~鈍これ~とかいうネタを思いついたけど言わないでおこう