1

我很想为 c++创建 javascriptsetTimeout和类似的功能(没有提升)。setInterval我想要实现的目标:一个基类,它可以在重复或单次延迟后调用其子类成员变量。

我已经有一个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 *obj和。void (object::*func)()我只是想出模板...

如何将 的两个模板化参数存储triggerNow在向量中?一旦我弄清楚这一点,我就可以创建我的 setTimeout 和 setInterval!

4

2 回答 2

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();
}
于 2012-10-13T18:33:31.030 回答
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;
};

现在您可以将它们作为 Callable 存储在 std::vector 中,因为模板化版本是从 Callable 派生的。如果您将指针存储在 std::vector<> 中,但您需要记住在某些时候删除它们。

所以会得到这样的东西:

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;
};
于 2012-10-13T18:36:42.507 回答