クラスにラムダ式を与えて、そのクラス内でstd::functionとして保持し、コールバック関数として機能させるようなものを実装したいと思っています。
例えば、クラス生成時にラムダ式を与えて、そのクラスが破棄されるときに呼ばれるようなものを作りたいと考えています。
また、あらゆる引数でも実行できるようにし、さらにコールバック関数が設定されていないことも考慮して、boost::none_t, std::function<void()>, std::function<void(int)>, ... という方に対応できる共用型にしようかと考えました。
具体的には以下の様なイメージのコードが成立するようにしたいです(実際はコンパイルエラーを起こします)。
どのように書くべきでしょうか。
C++
1#include <iostream> 2#include <boost/variant.hpp> 3#include <boost/none.hpp> 4#include <functional> 5 6class some_class { 7 8private: 9 using call_back_func_t = boost::variant< 10 boost::none_t, 11 std::function<void()>, 12 std::function<void(int)> 13 >; 14 15 auto some_func() { 16 boost::apply_visitor(call_back_visitor(), call_back_); 17 } 18 19 call_back_func_t call_back_; 20 21public: 22 23 struct call_back_visitor : public boost::static_visitor<> { 24 auto operator()(boost::none_t const& none) const {} 25 auto operator()(std::function<void()> func) const { func(); } 26 auto operator()(std::function<void(int)> func, int x) const { func(x); } 27 }; 28 29 some_class(call_back_func_t call_back): call_back_(call_back){} 30 ~some_class(){ some_func(); } 31 32 33}; 34 35int main() { 36 37 int x = 5; 38 39 some_class a( 40 boost::none 41 ); 42 43 { 44 some_class b( 45 []{ std::cout << "ok" << std::endl; } 46 ); 47 } 48 49 some_class c( 50 [x](){ std::cout << x << std::endl; } 51 ); 52 53 /* 54 望まれる実行結果 55 ./a.out 56 ok 57 5 58 */ 59 60}
回答2件
あなたの回答
tips
プレビュー