setTimeout类似于c ++的功能

时间:2012-10-13 18:22:56

标签: c++ class timeout

我很乐意为c ++创建javascript' s setTimeoutsetInterval功能(无需提升)。我想要实现的目标:一个可以在重复或一次延迟后调用其子类成员变量的基类。

我已经有一个update功能,时间已经过去了。我还发现了如何将成员函数指针传递给基类并使用以下方法触发该函数:

class BaseClass {
public:
     template <class object>
     void triggerNow(object *obj, void (object::*func)()) {
          ((obj)->*(func))();
     }

} 

class SubClass : public BaseClass {
public:
    void update() {
         triggerNow(this, &SubClass::worked)
    }
    void worked() {
         cout << "worked!";
    }
}

我目前面临的问题是如何将object *objvoid (object::*func)()存储在矢量(或其他容器)中。我只是搞清楚模板......

如何将triggerNow的两个模板化参数存储在矢量中?一旦我弄明白了,我就可以创建我的setTimeout和setInterval!

2 个答案:

答案 0 :(得分:2)

尚未评论时序功能。

但是,由于您使用的是父类和基类,我建议使用多态,而不是模板成员函数。

class BaseClass {
    public:
        virtual void triggerMe() = 0;

 };

class SubClass1 : public BaseClass {
    public:
        virtual void triggerMe()
        {
            //real code, do something
        }

 };

class SubClass2 : public BaseClass {
    public:
        virtual void triggerMe()
        {
            //real code, do something else
        }

 };

然后你可以得到一个vector BaseClass指针:

vector<BaseClass*> objects;

objects.push_back(new SubClass1);
objects.push_back(new SubClass2);

for (auto it = objects.begin(); it != objects.end(); it++)
{
    it->triggerMe();
}

答案 1 :(得分:1)

为了在对象中存储object *和object :: * func,你可以这样做:

struct Callable
{
  virtual ~Callable () {};
  virtual void operator()() = 0;
};

template <class Object>
struct TemplateCallable : public Callable
{
  typedef void (Object::*MemberFunction)();

  TemplateCallable(Object* obj, MemberFunction mem_fun)
     : _object(obj),
       _mem_fun(mem_fun)
  {}

  void operator() ()
  {
    _object->*_mem_fun();
  }

  Object* _obj;
  MemberFunction _mem_fun;
};

现在你可以将它们存储为std :: vector中的Callable,因为模板化版本是从Callable派生的。如果将指针存储在std :: vector&lt;&gt;中虽然你需要记住在某些时候删除它们。

所以会得到这样的东西:

class TimerSomething
{
   template <class Object>
   void registerCallback (Object* obj, void (Object::*MemFun)())
   {
     _callbacks.push_back(new TemplatedCallback<Object>(obj, mem_fun));
   }

   void triggerAll ()
   {
     for (std::vector<Callable*>::iterator iter = _callbacks.begin();
          iter != _callbacks.end(); ++iter)
     {
       (**iter)();
     }
   }

   std::vector<Callable*> _callbacks;
};