Don*_*ono 5 c++ signals signals-slots c++11 std-function
我试图在没有提升的情况下用C++创建一个简单的信号/插槽系统,但是当我尝试将它与参数一起使用时,我遇到了一些问题,这是我的代码:
我的信号类:
template <typename T>
class Signal
{
private:
typedef std::function<T> Slot;
public:
Signal();
void connect( Slot slot );
void emit( T data );
void emit();
private:
std::vector<Slot> slots;
};
Run Code Online (Sandbox Code Playgroud)
我的测试课:
class Object
{
public:
Object();
void sayHello( int i );
};
Run Code Online (Sandbox Code Playgroud)
所以,我像这样使用我的班级:
Signal<void(int)> signal;
signal.connect( std::bind( &Object::sayHello, player, std::placeholders::_1 ) );
signal.emit( 0 );
Run Code Online (Sandbox Code Playgroud)
我在Signal.cpp中收到警告: 候选函数不可行:第一个参数没有从'void(*)(int)'到'int'的已知转换;
在这段代码中:
template <typename T>
void Signal<T>::emit( T data )
{
typename std::vector<Slot>::iterator i;
Slot t;
for( i = this->slots.begin(); i != this->slots.end(); i++ )
{
t = (*i);
t( data ); // Here
}
}
Run Code Online (Sandbox Code Playgroud)
我怎么解决这个问题?如果我想给我的"emit"方法提供一个对象或倍数参数,我可以吗?
谢谢!
从你的Signal班级中挑选三行:
template <typename T>
// ...
typedef std::function<T> Slot;
// ...
void emit( T data );
Run Code Online (Sandbox Code Playgroud)
并声明你的信号:
Signal<void(int)> signal;
Run Code Online (Sandbox Code Playgroud)
答案应该是非常明显的:void emit(T)成为void emit(void(*)(int))(函数类型,如void(int)当它们是函数参数时转换为指针).
我只是建议使用相同的方式使用每个类模板T<Signature>:部分特化.
template<class Sig>
class Signal;
template<class R, class... Args>
class Signal<R(Args...)>{
// ...
typedef std::function<R(Args...)> Slot;
// ...
void emit(Args... args) const{
// iterate over slots and call them, passing `args...`
}
};
Run Code Online (Sandbox Code Playgroud)