如何编写sigc++的包装器类
how to write a wrapper class for sigc++?
希望有一个中心位置来注册新的信号,连接到信号,等等。现在我想用sigc++。但是,我不知道如何为这个基于模板的库编写包装器类。类似以下语句:
class EventManager {
public:
... singleton stuff ...
template<typename ReturnType, typename Params>
bool registerNewSignal( std::string &id )
{
sigc::signal<ReturnType, Params> *sig = new sigc::signal<ReturnType, Params>();
// put the new sig into a map
mSignals[ id ] = sig;
}
// this one should probably be a template as well. not very
// convenient.
template<typename ReturnType, typename Params>
void emit( id, <paramlist> )
{
sigc::signal<ReturnType, Params> *sig = mSignals[ id ];
sig->emit( <paramlist> );
}
private:
std::map<const std::string, ???> mSignals;
};
我应该怎么替换??为了使映射通用,但仍然能够检索给定id的相应信号,并使用给定的参数列表发出信号——我也不知道如何处理。
你需要一个基类,它有emit()函数:
template<class Ret>
class SigBase {
public:
virtual Ret emit()=0;
};
和它的一些实现:
template<class Ret, class Param1>
class SigDerived : public SigBase<Ret>
{
public:
SigDerived(sigc::signal<Ret, Param1> *m, Param1 p) : m(m), p(p){ }
Ret emit() { return m->emit(p); }
private:
sigc::signal<Ret, Param1> *m;
Param1 p;
};
那么映射就是指向基类的指针:
std::map<std::string, SigBase<Ret> *> mymap;
编辑:如果SigBase没有Ret值,而是只支持void返回,可能会更好。
这是我目前所做的。它有效……但感觉很恶心。我怎样才能进一步改进它?例如,如何摆脱reinterpret_cast?
@dimitri:谢谢你关于互斥锁的提示,我会添加的。
class Observer {
public:
static Observer* instance()
{
if ( !mInstance )
mInstance = new Observer();
return mInstance;
}
virtual ~Observer() {}
template<typename ReturnType, typename Params>
sigc::signal<ReturnType, Params>* get( const std::string &id )
{
SignalMap::const_iterator it = mSignals.find( id );
if ( it == mSignals.end() )
return 0;
return reinterpret_cast<sigc::signal<ReturnType, Params>*>( (*it).second );
}
template<typename ReturnType, typename Params>
bool registerSignal( const std::string &id )
{
SignalMap::const_iterator it = mSignals.find( id );
if ( it != mSignals.end() ) {
// signal with the given id's already registered
return false;
}
// create a new signal instance here
sigc::signal<ReturnType, Params> *sig = new sigc::signal<ReturnType, Params>();
mSignals[ id ] = reinterpret_cast<sigc::signal<void>*>(sig);
return true;
}
private:
Observer()
{
}
SignalMap mSignals;
static Observer* mInstance;
};
Observer* Observer::mInstance = 0;
相关文章:
- 如何使用可变模板编写通用函数包装器
- 在编写包装现有函数并检查错误的模板函数时,如何使用完美转发?
- C++,当函子不是一个选项时,我如何编写带有自定义函数调用的模板化 RAII 包装器?
- 如何为返回枚举元组的 C++ 函数编写 cython 包装器?
- 如何为其他类成员函数编写模板包装方法
- 如何使用模板函数参数编写包装函数,该功能可以采用超载的成员函数
- 编写安全包装类以管理用户定义对象的指针
- 为 c++ 代码编写 python 包装器
- 如何在 C++14 中编写用于调用 Fortran 函数的通用包装器(按引用调用 --按值调用>)
- 如何编写 C++ 类成员函数包装器
- 如何编写PMPI库来包装MPI功能
- 编写C 简化具有复杂层次结构的C 类的包装器,以便Cython可以称呼它
- 字符 * 和字符串在C++中有何不同?(在描述中编写代码)
- 如何编写尽可能薄的类型包装器
- MATLAB LECACY_CODE工具 - 编写包装器功能以捕获数组
- c++11:如何编写一个包装函数来生成"std::function"对象
- 编写值包装类的最佳方式
- 如何编写包装类以将 Qt 信号映射到 C# 事件(通过 C++/CLI)
- 如何围绕表达式模板编写第三方库包装类
- 如何在c#上为具有双间接参数的包装c++方法编写签名?