Функторы + указатели на элементы для создания объекта сигнала

У меня есть этот код:

// 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);
        }
};

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

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

Буду признателен за вашу помощь и "исправления".

Спасибо!

1 ответ

Решение

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

#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++ шаблон typedef

Другие вопросы по тегам