Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/140.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以在C++;?_C++_Pointers_Methods_Types_Dispatcher - Fatal编程技术网

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?