前提・実現したいこと
c++で、イベント発生時にコールバック関数を呼び出すベンダー製ライブラリの機能を顧客に提供したいです。
しかし、すべて開示するのではなく必要な情報のみ開示するために自作ライブラリを作成して隠蔽したいです。
さらに顧客が実装する自作クラスのメンバ関数を、イベント発生時に呼び出すコールバック関数として登録できるようにしたいです。
ヘッダファイルの関係性は下記のイメージで、顧客に提供するのはmy_vendorlib_api.hppのみにしたいです。
(実際にはmy_vendorlib_listener.hppはmy_vendorlib_api.cppにてincludeすることで分離/隠蔽できるのかなと考えました)
vendorlib.hpp(ベンダー製Lib)
--> my_vendorlib_listener.hpp
--> my_vendorlib_api.hpp(顧客にはこのヘッダファイルと動的リンクライブラリのみ渡す想定)
--> sample.hpp(顧客が実装)
発生している問題・エラーメッセージ
しかしながら、自作クラスのメンバ関数をイベント発生時のコールバック関数に登録しようとすると、テンプレート記法を使うことになりヘッダーファイルにコールバック関数登録の実装を書かなければならず、my_vendorlib_listener.hppを隠蔽する方法がわからないということに悩んでいます。
そもそも思想が間違っているなども含めて、アドバイスいただけると幸いです。
my_vendorlib_api.hpp: error: invalid use of imcomplete type 'class MyVendorLibListener' this->my_vendorlib_listener->set_callback(boost::bind(fp, obj, boost::placeholders::_1)); ^
該当のソースコード
my_vendorlib_listener.hpp
c++
1#ifndef MYVENDORLIBLISTENER_H 2#define MYVENDORLIBLISTENER_H 3 4#include <functional> 5#include "vendorlib.h" 6 7class MyVendorLibListener : public vendorliblistener 8{ 9public: 10 //event関数がイベント発生時に呼ばれるので、msgの内容を絞ってcallback関数を呼ぶ実装にする 11 void event(VendorCustomMessage msg); 12 int set_callback(std::function<void (int)> callback); 13private: 14 std::function<void (int)> callback; 15}; 16 17#endif
my_vendorlib_api.hpp
c++
1#ifndef MYVENDORLIBAPI_H 2#define MYVENDORLIBAPI_H 3 4//my_vendorlib_listener.hppはソースファイル側でincludeすることで隠蔽したい 5#include <functional> 6#include <boost/bind.hpp> 7 8class MyVendorLibApi 9{ 10private: 11 class MyVendorLibListener* my_vendorlib_listener; 12public: 13 template<class T> 14 void set_callback(void(T::*fp)(int a), T *obj) 15 { 16 //テンプレートを使っているため、このヘッダファイルでmy_vendorlib_listenerを使った実装をせざるを得なくなりエラーとなる 17 this->my_vendorlib_listener->set_callback(boost::bind(fp, obj, boost::placeholders::_1)); 18 } 19}; 20 21#endif
回答3件
あなたの回答
tips
プレビュー