【问题标题】:c++ store functor in classc ++在类中存储函子
【发布时间】:2016-03-08 18:52:40
【问题描述】:

我创建了以下事件类:

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

【问题讨论】:

  • 不应该是T fnktptr;T * fnktptr;
  • 是的,你不能有一个函数类型的对象,这是不允许的。
  • 我现在用T* fnktptr 尝试过,现在我得到这些错误:undefined reference to Event&lt;int ()&gt;::Event() 错误发生在Event&lt;decltype(consumeInt)&gt; event; 这是我的函数consumeInt:Event&lt;decltype(consumeInt)&gt; event;
  • @SergeyA:我的问题有什么可行的替代方案? (将仿函数存储在类中以供进一步使用。)
  • 1) 你不能有类型函数的成员。 2)当您将其固定为指针时,您必须在头文件中定义模板。

标签: c++ functor template-classes


【解决方案1】:

根据您最新的 cmets,我会说 std::function&lt;&gt; 是最好的前进方式。下面的示例代码假设您只想调用 fnktptr 而并不关心结果。

#include <functional>

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

如果您需要捕获结果,您将无法对每个Event 对象任意有不同的返回。你要么必须选择一个,要么使用boost::variant&lt;&gt;之类的东西。

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

这将允许您创建 Event&lt;int&gt; 对象,例如与 consumeInt() 一起使用。

例子:

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

【讨论】:

  • 非常感谢!现在它适用于std::function&lt;T ()&gt; fnktptr; 解决方案。
猜你喜欢
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 2017-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-02
  • 2018-04-20
相关资源
最近更新 更多