2012-04-21 3 views
1

У меня есть этот код:функторов + указатели членов создать объект сигнала

// signal supporter parent 
class signalable {}; 

template <class typeT = signalable> 
typedef void (typeT::*trig)(std::string); 

template <class typeT = signalable> 
class trigger 
{ 
    private: 
     typeT* instance; 
     typeT::trig fun; 

    public: 
     trigger(typeT* inst, typeT::trig function) 
      : instance(inst), fun(function) 
     {} 
     void operator()(std::string param) 
     { 
      (instance->*fun)(param); 
     } 
}; 

И я получаю много ошибок компиляции, что я пари профи знают. Я немного запутался в этом контексте.

Что я хочу сделать, это ясно: передать указатель на объект и указатель на одну из его функций-членов, чтобы сделать функтор и передать его в моей программе.

Поблагодарили бы за помощь и «исправления».

Спасибо!

+2

Бен C ответил на ваш вопрос, но вы можете посмотреть в [шаблон Observer] (http://en.wikipedia.org/ wiki/Observer_pattern) для приятного подхода к тому, что я считаю вашей ** оригинальной ** проблемой. – smocking

+0

@smocking Я ценю вашу точку зрения, случай, с которым я имел дело раньше, но в этом случае модель наблюдателя моя цель, поскольку в моих кодовых событиях должны распространяться в «цепном» стиле, а не какое-то событие, распространяемое на несколько . вызываемые методы Во всяком случае, спасибо, что помогли мне заметить контраст. – Haix64

+0

Я не уверен, что понимаю, почему вам нужна такая сигнализация, но не могли бы вы немного расширить шаблон, если бы ваши «цепные» классы сигнализации наследовали как интерфейс Observer, так и Observable? – smocking

ответ

0

Вы пытаетесь сделать что-то подобное?

#include <string> 
#include <iostream> 

// signal supporter parent 
class signalable 
{ 
public: 
    void foo(std::string s) { std::cout << "hello: " << s << std::endl; } 
}; 


template <class typeT = signalable> 
class trigger 
{ 

    typedef void (typeT::*trig)(std::string); 

    private: 
     typeT* instance; 
     trig fun; 

    public: 
     trigger(typeT* inst, trig function) 
      : instance(inst), fun(function) 
     {} 
     void operator()(std::string param) 
     { 
      (instance->*fun)(param); 
     } 
}; 

int main() 
{ 
    signalable s; 
    trigger<> t(&s, &signalable::foo); 
    t("world"); 
} 

Что касается некоторых конкретных ошибок в коде, большинство из них, по-видимому, относятся к вашему typedef. C++ 11 позволяет «шаблоны typedefs», но они не выглядят так. Посмотрите на эту тему на примере шаблона:

определений типов

C++ template typedef

+0

Ваш код правильный Бен. Простое изменение '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' конструктору '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' Спасибо. – Haix64