class 中的 c++ 存储函数
c++ store functor in class
我创建了以下事件 class:
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;
但最后,我想将它与这样的仿函数一起使用:
Event<decltype(consumeInt)> event;
event.fnktptr = consumeInt;
但现在我在 Event.h 文件中得到一个错误:
T fnktptr; //Error: field ‘Event<int()>::fnktptr’ invalidly declared function type
根据您的最新评论,我认为 std::function<>
是最好的前进方式。下面的示例代码假设您只想调用 fnktptr
而不关心结果。
#include <functional>
class Event
{
public:
std::function<void ()> fnktptr;
Event();
virtual ~Event();
};
如果需要抓取结果,就不能任意对每个Event
对象有不同的returns。您要么必须选择一个,要么使用 boost::variant<>
.
之类的东西
template<class T>
class Event
{
public:
std::function<T ()> fnktptr;
Event();
virtual ~Event();
};
这将允许您创建 Event<int>
个对象,例如与 consumeInt()
一起使用。
示例:
Event<int> event;
event.fnktptr = consumeInt;
我创建了以下事件 class:
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;
但最后,我想将它与这样的仿函数一起使用:
Event<decltype(consumeInt)> event;
event.fnktptr = consumeInt;
但现在我在 Event.h 文件中得到一个错误:
T fnktptr; //Error: field ‘Event<int()>::fnktptr’ invalidly declared function type
根据您的最新评论,我认为 std::function<>
是最好的前进方式。下面的示例代码假设您只想调用 fnktptr
而不关心结果。
#include <functional>
class Event
{
public:
std::function<void ()> fnktptr;
Event();
virtual ~Event();
};
如果需要抓取结果,就不能任意对每个Event
对象有不同的returns。您要么必须选择一个,要么使用 boost::variant<>
.
template<class T>
class Event
{
public:
std::function<T ()> fnktptr;
Event();
virtual ~Event();
};
这将允许您创建 Event<int>
个对象,例如与 consumeInt()
一起使用。
示例:
Event<int> event;
event.fnktptr = consumeInt;