我有这个问题困扰我.我有FSM类,它将键与回调相关联
class FSM
{
public:
typedef bool (FSM::*InCallback_t)( int );
typedef std::map< std::string, InCallback_t > Table;
// Since I would like to allow the user to register both functors and class member functions
template< typename Callback_t, bool (Callback_t::*CallbackFunct_t)(int) >
bool callback( int x )
{
return (Callback_t().*CallbackFunct_t)( x );
}
void addCallback( const std::string& iKey, InCallback_t iCallback )
{
_table.insert( std::make_pair( iKey, iCallback ) );
}
[ ... ]
private:
Table _table;
};
Run Code Online (Sandbox Code Playgroud)
还有一些回调类
class CallbackBase
{
public:
bool operator()( …Run Code Online (Sandbox Code Playgroud) 我正在设计一个OO框架,我面临着以下问题.
让我们说在框架中我有一个Shape接口,用户可以自由地实现和扩展(添加新函数)Shape接口来创建自己的数字,例如Square和Circle.要使这些新对象可用,用户必须将它们注册到ShapeFactory中,以指定形状(字符串)和对象的名称.
此外,该框架提供了一个名为ShapeWorker的接口,它定义了以下函数:
class ShapeWorker
{
public:
void processShape( Shape& shape ) = 0;
};
Run Code Online (Sandbox Code Playgroud)
用户可以自由地实现ShapeWorker接口来制作特定的形状工作者,例如SquareWorker和CircleWorker.要使这些新对象可用,用户必须将它们注册到WorkerFactory,指定形状(字符串)和对象的名称.
在某个时刻,框架给定一个表示形状名称的字符串,通过使用ShapeFactory创建一个新的Shape,然后(代码中的其他地方)通过使用具有相同形状名称的WorkerFactory创建一个新的ShapeWorker.该processShape,然后调用提供的形状之前创建的实例.
[ ... ]
Shape* myShape = shapeFactory.create( shapeName );
[ ... ]
ShapeWorker* myWorker = workerFactory.create( shapeName );
myWorker->processShape( *myShape );
[ ... ]
Run Code Online (Sandbox Code Playgroud)
关键是,这样做,我强迫用户实现,例如,SquareWorker从Shape到Square进行向下转换为 …