5

ブーストなしで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;    
};

私のテストクラス:

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 に警告があります: Candidate function not viable: no known conversion from 'void (*)(int)' to 'int' for 1st argument;

このコードでは:

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」メソッドにオブジェクトまたは倍数のパラメーターを指定したい場合、どうすればよいですか?

ありがとう!

4

1 に答える 1

6

Signalクラスから3行を選択します。

template <typename T> 
    // ...
    typedef std::function<T> Slot;
    // ...
    void emit( T data );

そしてあなたの信号の宣言:

Signal<void(int)> signal;

答えはかなり明白なはずです: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...`
  }
};
于 2012-11-07T20:49:53.970 に答える