Más contenido relacionado
拙iPhoneアプリ『ういろう』でのboost成分
- 2. • 各種パソコン
• SS
C
• N64
• PS、PS2
• GC
• DC
• PSP
2011~
アセンブラ
1996~
1990~
自己紹介
C++
• iPhone
• Windows
• OSX
- 12. boost::noncopyable
• OpenGLのハンドルを扱う時にも
struct Texture {
GLuint id;
Texture() {
glGenTextures(1, &id);
}
~Texture() {
glDeleteTextures(1, &id);
}
};
int main() {
Texture hoge;
Texture fuga = hoge;
}
// コンストラクタでOpenGLのハンドルを生成
// デストラクタでハンドルを破棄
// この操作でidが二重化されてしまい、破棄の際に動作が未定義になる
- 16. boost::signals2
#include <iostream>
#include <boost/signals2/signal.hpp>
struct Hoge {
void step(const int value) {
std::cout << "Hoge:" << value << std::endl;
}
};
struct Fuga {
void draw(const int value) {
std::cout << "Fuga:" << value + 1 << std::endl;
}
};
int main() {
boost::signals2::signal<void (const int)> signal;
Hoge hoge;
signal.connect(boost::bind(&Hoge::step, &hoge, _1));
Fuga fuga;
signal.connect(boost::bind(&Fuga::draw, &fuga, _1));
signal(10);
}
• 登録した関数をまとめて呼び出し
てくれる
• 関数の引数と戻り値の型が一致し
ているだけでよく、抽象クラスを
継承したりする必要がない
• std::shared_ptrを利用すると、登
録元が消滅したときに自動的に登
録を解除してくれる(別項で説明)
- 21. boost::signals2
// signals2に登録されている関数
void getMessage(const int msg) {
switch (msg) {
case Msg::UPDATE:
// 更新
update();
return;
case Msg::DRAW:
// 描画
draw();
return;
}
case Msg::PLAYER_JUMPATTACK:
// プレイヤーからのジャンプアタックを処理
hitCheck();
return;
}
攻撃対象のオブジェクトは、攻撃
メッセージを受け取った時の処理
を追加
• プレイヤー側では、どのオブジェク
トが攻撃対象かを知る必要がない
• 「攻撃演出」も、他のオブジェクト
で独立して簡単に処理できる
- 26. boost::any
// signals2に登録されている関数
void getMessage(const int msg, params) {
switch (msg) {
case Msg::UPDATE:
// 更新
update(params);
return;
case Msg::DRAW:
// 描画
draw(params);
return;
}
メッセージ送信で問題になったの
が、値の受け渡しでした
• メッセージごとに構造体を作ったと
して…それをどうやって関数に渡そ
う。キャスト??
• ういろうでは50種類ほどメッセージ
が存在します
- 33. boost::bind
• boost::signals2にstd::shared_ptrを登録する時に必須で
した
struct Hoge {
void CallBack(int value) { /* 何らかの処理 */ }
};
typedef boost::signals2::signal<void (int value)> Signal;
Signal signal;
void connect(std::shared_ptr<Hoge> object) {
// boost::bindが使われている
signal.connect(Signal::slot_type(&Hoge::CallBack, object.get(), _1).track_foreign(object));
}