1

私はJavaScriptのような機能をc ++(ブーストなし)で作成したいsetTimeoutと思っています。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テンプレート化された 2 つのパラメータをベクトルに格納するにはどうすればよいですか? これが分かれば、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から派生しているため、これで、それらをCallableとしてstd::vectorに格納できます。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 に答える