Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++_Templates_C++11 - Fatal编程技术网

C++ 在回调中使用可变模板

C++ 在回调中使用可变模板,c++,templates,c++11,C++,Templates,C++11,我正在用一个简单的“代理”系统做一个游戏 这是源文件(很抱歉有法语评论): \ifndef C\u代表\u水电站_ #定义C_代表_水电站_ #包括 #包括 #包括 名称空间ns { //////////////////////////////////////////////////////////////////////////////// ///类别gérant未列出回调。从0到1的中心回调 ///争论。 /// 样板 C类代表 { 公众: /////////////////////////

我正在用一个简单的“代理”系统做一个游戏

这是源文件(很抱歉有法语评论):

\ifndef C\u代表\u水电站_
#定义C_代表_水电站_
#包括
#包括
#包括
名称空间ns
{
////////////////////////////////////////////////////////////////////////////////
///类别gérant未列出回调。从0到1的中心回调
///争论。
///
样板
C类代表
{
公众:
////////////////////////////////////////////////////////////////////////////
///键入des callbacks。
///
typedef std::函数回调;
////////////////////////////////////////////////////////////////////////////
///结构répresentant un回调。
///
结构S_回调
{
回调ptr;
布尔一次;
};//S_回调
////////////////////////////////////////////////////////////////////////////
///键入pour la liste des callbacks。
///
typedef std::list callback_list;
公众:
////////////////////////////////////////////////////////////////////////////
///建筑工人。
///
C_代表(无效)
{ }
////////////////////////////////////////////////////////////////////////////
///毁灭者。
///
虚拟~C_委托(无效)抛出()
{ }
////////////////////////////////////////////////////////////////////////////
///连接回调列表中的函数。
///
///@param cb:Callback。
///@param instance:instance de l'objet use le callback。
///@param once:Détermine si le callback这是你的名字。
///
void connect(回调cb,bool once=false)抛出()
{
_callbacks.push_back({cb,once});
}
////////////////////////////////////////////////////////////////////////////
///李斯特基金会。
///
///@param cb:Callback。
///@param instance:instance de l'objet use le callback。
///
无效断开连接(回调cb)抛出()
{
for(自动i=_callbacks.begin();i!=_callbacks.end();i++){
如果(i->callback_ptr==cb){
_回调。删除(i);
回来
}
}
}
////////////////////////////////////////////////////////////////////////////
///他对我的行为表示同情。
///
///@param a1:Argument作为辅助回调传递。
///
无效发射(Args…Args)抛出()
{
for(自动i=_callbacks.begin();i!=_callbacks.end();i++)
{
i->callback\u ptr(args…);
如果(i->一次)
_callbacks.erase(i);
}
}
私人:
////////////////////////////////////////////////////////////////////////////
///回拨列表。
///
回调\列表\回调;
};//C_委托
}//名称空间ns
#恩迪夫
门楣儿什么也没说,很好。但是,与
C_委托一起使用时
会创建此错误:
无效的参数类型“void”

如何使我的
C_Delegate::emit
方法允许使用无参数回调


谢谢你的回答

使用
C_Delegate
代替
C_Delegate

使用
C_Delegate
代替
C_Delegate

代替
C_Delegate
代替
无参数,空参数包拼写为
。尝试使用
C_委托


顺便说一下,它们被称为可变模板,
varargs
通常指的是
C
..
空参数包的拼写是
而不是
。尝试使用
C_委托

顺便说一句,它们被称为变量模板,
varargs
通常指的是
C
..

#ifndef C_DELEGATE_HPP_
#define C_DELEGATE_HPP_


#include <list>
#include <functional>

#include <boost/function.hpp>


namespace ns
{


////////////////////////////////////////////////////////////////////////////////
/// Classe gérant une liste de callback. Les callbacks ont entre 0 et 1
/// arguments.
///
template <typename ... Args>
class C_Delegate
{

public:

    ////////////////////////////////////////////////////////////////////////////
    /// Type des callbacks.
    ///
    typedef std::function<void (Args...)> callback;




    ////////////////////////////////////////////////////////////////////////////
    /// Structure répresentant un callback.
    ///
    struct S_Callback
    {

        callback    callback_ptr;

        bool        once;

    }; // S_Callback




    ////////////////////////////////////////////////////////////////////////////
    /// Type pour la liste des callbacks.
    ///
    typedef std::list <S_Callback> callback_list;



public:

    ////////////////////////////////////////////////////////////////////////////
    /// Constructeur.
    ///
    C_Delegate (void)
    { }


    ////////////////////////////////////////////////////////////////////////////
    /// Destructeur.
    ///
    virtual ~C_Delegate (void) throw ()
    { }




    ////////////////////////////////////////////////////////////////////////////
    /// Connecte une fonction à la liste des callbacks.
    ///
    /// @param cb : Callback.
    /// @param instance : Instance de l'objet utilisant le callback.
    /// @param once : Détermine si le callback est appelé que une fois ou non.
    ///
    void connect (callback cb, bool once=false) throw ()
    {

        _callbacks.push_back ( {cb, once} );

    }


    ////////////////////////////////////////////////////////////////////////////
    /// Déconncte une fonction de la liste.
    ///
    /// @param cb : Callback.
    /// @param instance : Instance de l'objet utilisant le callback.
    ///
    void disconnect (callback cb) throw ()
    {
        for (auto i = _callbacks.begin(); i != _callbacks.end(); i++) {
            if (i->callback_ptr == cb) {
                _callbacks.erase(i);
                return;
            }
        }
    }




    ////////////////////////////////////////////////////////////////////////////
    /// Appels tous les callbacks lé à l'objet actuel.
    ///
    /// @param a1 : Argument à passer aux callbacks.
    ///
    void emit(Args... args) throw ()
    {
        for (auto i = _callbacks.begin(); i != _callbacks.end(); i++)
        {
            i->callback_ptr(args...);

            if (i->once)
                _callbacks.erase (i);
        }
    }



private:

    ////////////////////////////////////////////////////////////////////////////
    /// Liste des callbacks.
    ///
    callback_list   _callbacks;


}; // C_Delegate


} // namespace ns

#endif