C++ 是否可以在C++;?
考虑以下代码:C++ 是否可以在C++;?,c++,pointers,methods,types,dispatcher,C++,Pointers,Methods,Types,Dispatcher,考虑以下代码: struct X { void MethodX() { ... } }; struct Y { void MethodY() { ... } }; void test () { X x; Y y; Dispatcher d; d.Register("x", x, &X::MethodX); d.Register("y", y, &Y::MethodY); d.Call("x"); d.Call("y"
struct X {
void MethodX() {
...
}
};
struct Y {
void MethodY() {
...
}
};
void test () {
X x;
Y y;
Dispatcher d;
d.Register("x", x, &X::MethodX);
d.Register("y", y, &Y::MethodY);
d.Call("x");
d.Call("y");
}
问题是如何实现Dispatcher。
我不介意X和Y可能继承某些东西,但Dispatcher应该允许进一步的客户端(不仅仅是X和Y)。
如果可能的话,我想避免使用void*指针:)看看,它就是这样做的。看看这篇文章:
在C++中实现了基于模板的函子。void*在引擎盖下使用,但它是类型安全的,因为它由创建和展开void*的模板函数包装。这将使实施变得容易。它支持普通方法指针不支持的各种调用样式(例如,您可以将返回某物的函数作为返回void的functor传递,它会自动忽略返回值)
为了避免提高使用率并实现您自己的调用样式,您可以看看这本书书中描述了一个Loki库,它很好地解释了如何让你自己的functor足够聪明以满足你的需要
class Dispather
{
public:
typedef boost::function< void ( void ) > FunctionT;
void Register( const std::string& name, FunctionT function )
{
registered_[ name ] = function;
}
void Call( const std::string& name )
{
RegisterdFunctionsT::const_iterator it =
registered_.find( name );
if ( it == registered_.end() )
throw std::logic_error( "Function is not registered" );
(it->second)();
}
private:
typedef std::map< std::string, FunctionT > RegisterdFunctionsT;
RegisterdFunctionsT registered_;
};
int main()
{
X x;
Y y;
Dispather d;
d.Register( "x", boost::bind( &X::MethodX, &x ) );
d.Register( "y", boost::bind( &Y::MethodY, &y ) );
d.Call( "x" );
d.Call( "y" );
return 0;
}
类Dispather
{
公众:
typedef boost::functionFunctionT;
无效寄存器(const std::string&name,FunctionT function)
{
注册名称=函数;
}
void调用(const std::string和name)
{
registerFunctionST::const\u迭代器=
注册查找(名称);
if(it==registered_uz.end())
抛出std::逻辑_错误(“函数未注册”);
(it->second)();
}
私人:
typedef std::mapRegisterdFunctionsT;
registerFunctionst注册;
};
int main()
{
X;
Y;
dispatherd;
d、 寄存器(“x”,boost::bind(&x::MethodX,&x));
d、 寄存器(“y”,boost::bind(&y::MethodY,&y));
d、 调用(“x”);
d、 调用(“y”);
返回0;
}
您有权访问boost库吗?请您澄清一下“问题在于保留方法指针或functor的数据结构类型。”我试图用std::tr1::mem_-fun模板实现这一点。但是结果的类型在参数的类型内。所以我无法生成包含它的异构向量。你需要没有boost的解决方案吗?实际上我可能会使用boost。因此,问题得到了回答。谢谢。我没有解决这个问题。看看最新的问题,也许是这样。我正在调查:)这看起来很棒。它如何将typeof(&X::MethodX)转换为function?我怎样才能自己实现它并避免增加使用量?为了避免增加使用量。。。然后使用boost::function?