【发布时间】:2012-11-07 20:41:51
【问题描述】:
我正在尝试在 C++ 中创建一个简单的信号/插槽系统而不使用 boost,但是当我尝试将它与参数一起使用时遇到了一些问题,这是我的代码:
我的信号课:
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;
};
我的测试课:
class Object
{
public:
Object();
void sayHello( int i );
};
所以,我就这样使用我的班级:
Signal<void(int)> signal;
signal.connect( std::bind( &Object::sayHello, player, std::placeholders::_1 ) );
signal.emit( 0 );
我在 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
}
}
我该如何解决?如果我想给我的“emit”方法一个对象或多个参数,我可以做吗?
谢谢!
【问题讨论】:
-
this 是您想要的吗?您指定
T==void(int),但emit似乎期望T==int。 -
哎呀!谢谢,确实可以更好地工作:)
标签: c++ c++11 signals signals-slots std-function