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