きままにブログ

プログラミングを主とした私のメモ帳です。寂しいのでコメントください笑

コールバックのインターフェース(テンプレート使用)

あるクラスのメンバ関数をコールバックとするにはいろいろな実装があると思いますが、例えばテンプレートを使うと次のようになります。ただし、あんまり美しくないですね……。std::functionalとstd::bindを使えばすぐに終わりますがちょっと速度が出ない問題があります。

#include <iostream>

template <typename CallbackClass>
class ACallbackInterface {
public:
	ACallbackInterface(void (CallbackClass::* member)(void), CallbackClass* callback_class)
		: member { member }, callback_class { callback_class } {}
	void operator()() {
		(callback_class->*member)();
	}
private:
	void (CallbackClass::* member)(void);
	CallbackClass* callback_class;
};

template <typename T>
class A {
public:
	A(ACallbackInterface<T>& i) : i { i } { }
	void func() {
		i();
	}
private:
	ACallbackInterface<T>& i;
};

int main() {
	class CallBack : public ACallbackInterface<CallBack> {
	public:
		CallBack() : ACallbackInterface<CallBack> { &CallBack::callback, this } {}
		void callback() {
			printf("hello\n");
		}
	};
	CallBack call_back {};
	A<CallBack> a { call_back };
	a.func();
}