はかせのラボ

私の頭の中を書いていく雑記ブログです

C++ タスクシステム⑫ ~本プロジェクトへ移植したいが壁にぶつかる~

あいさつ

どうも、はかせです。
今回は今まで作ってきたもの(Subjectとか)を
本プロジェクトへ移植します。

ただ今回の記事は○○できましたではなく、
○○できなくて困ってます系記事です。

unique_ptrのカスタムデリータがわからない

一番の問題です。
というかこれが解決したらあとは完全移植完了です。

unique_ptrには解放時の処理をプログラマーが登録することが出来ます。
やり方はテンプレート第二引数に関数の型、もしくは関数オブジェクトを
渡すだけです。

私が作ったSubjectとReactivePropertyはどちらもデストラクタを非公開にして
解放関数を呼ぶかOnCompletedを受けて解放処理を行います。
なのでこの処理をカスタムデリータに指定して使おうとしました。

なんですが、カスタムデリータを指定したらインスタンス生成が
何故かうまくいかないんですよね・・・

今まで使っていたmake_uniqueは対応していないみたいなので
make関数なしで作っても入るのはnullptrのみ・・・・

スマートポインタなしで使って対応するクラスのデストラクタで
解放処理を呼んでいますが、このやり方はいつ解放忘れするか
分かったもんじゃないので早いとこどうにかしたいんですよね・・・・

最後にできなかったコードを載せます。

//関数オブジェクト
template<class T>
struct Deleter
{
	void operator()(T* value) 
	{
		value->Dispose();
	}
};

int main(int argc, char const* argv[])
{
#if _DEBUG
	_CrtSetDbgFlag
	(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);
#endif

	std::unique_ptr<ReactivePropaty<double>, Deleter<ReactivePropaty<double>>> doubleRP;

	//make関数は非対応の模様
	doubleRP = std::make_unique<ReactivePropaty<double>, Deleter<ReactivePropaty<double>>>();

	//これでもnullptrが入る
	doubleRP = std::unique_ptr<ReactivePropaty<double>, Deleter<ReactivePropaty<double>>>();

	//使おうとしたらnullptrだった・・・・
	doubleRP->Subscribe([&](double value)->void {std::cout << value << std::endl; });
	*doubleRP = 1000;

	getchar();
	//解放処理はカスタムデリータで呼ばれるはずだから割愛
	getchar();

}

あとがき

今回はスマートポインタのカスタムデリータわからん記事でした。
今までのミスと違って糸口がさっぱり見えませんorz

諦めてデストラクタで逐一解放処理を書くしかないんですかね・・・
(なんか最近壁にぶつかってばっかな気がする)

それでは今回はこの辺でノシ