2016-03-08 2 views
0

I've создал следующий класс Event:C++ магазин функтор в классе

Event.h

#ifndef EVENT_H 
#define EVENT_H 

#include<string> 

template<typename T> 
class Event 
{ 
    public: 
     T fnktptr; //Error: field ‘Event<int()>::fnktptr’ invalidly declared function type 
     Event(); 
     virtual ~Event(); 
}; 

#endif // EVENT_H 

Event.cpp

#include "Event.h" 

template<typename T> 
Event<T>::Event() 
{ 
    //ctor 
} 
template<typename T> 
Event<T>::~Event() 
{ 
    //dtor 
} 
// No need to call this TemporaryFunction() function, 
// it's just to avoid link error. 
void TemporaryFunction() 
{ 
    Event<int> TempObj; 
} 

Теперь я проверил это с помощью следующего кода и он работает:

Event<int> event; 
int t = 5; 
event.fnktptr = t; 

Но fi наконец, я хочу использовать его с функтором, как это:

Event<decltype(consumeInt)> event; 
event.fnktptr = consumeInt; 

Но теперь я получаю сообщение об ошибке в файле Event.h:

T fnktptr; //Error: field ‘Event<int()>::fnktptr’ invalidly declared function type 
+0

Не должен 'Т fnktptr;' 'быть Т * fnktptr;'? – xvan

+0

Да, вы не можете иметь объект типа функции, он не разрешен. – SergeyA

+0

Я попробовал теперь с 'T * fnktptr' и теперь я получаю эти ошибки:' неопределенную ссылку на событие :: Event() ' произошла ошибка в' Event событие, ' Это моя функция consumeInt: 'Событие событие;' –

ответ

1

Основываясь на ваши последние комментарии, я бы сказал, std::function<> - лучший способ продвижения вперед. В приведенном ниже примере кода предполагается, что вы просто хотите позвонить fnktptr и не заботитесь о результатах.

#include <functional> 

class Event 
{ 
    public: 
     std::function<void()> fnktptr; 
     Event(); 
     virtual ~Event(); 
}; 

Если вам нужно захватить результат, вы не сможете произвольно иметь различные возвращения для каждого Event объекта. Вы либо должны выбрать один или использовать что-то вроде boost::variant<>.

template<class T> 
class Event 
{ 
    public: 
     std::function<T()> fnktptr; 
     Event(); 
     virtual ~Event(); 
}; 

Это позволит вам создавать Event<int> объекты, например, для использования с consumeInt().

Пример:

Event<int> event; 
event.fnktptr = consumeInt; 
+0

Большое спасибо! Теперь он работает для меня с решением 'std :: function fnktptr;'. –

Смежные вопросы