0

我创建了以下事件类:

事件.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

事件.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;

但最后,我想将它与这样的仿函数一起使用:

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

但现在我在 Event.h 文件中得到一个错误:

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

1 回答 1

2

根据您的最新评论,我会说 astd::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>对象,例如使用 with consumeInt()

例子:

Event<int> event;
event.fnktptr = consumeInt;
于 2016-03-08T19:35:09.553 回答