現在、C++x0でメソッド実行キューを作成中です。push()
基本的なキューメカニズムを実装して検証しましたが、特定のメソッドへの以前のすべての呼び出しを自動的に削除するオプションを使用して修正したいと思います。
queue.push(this, &Obj::foo, 1);
queue.push(this, &Obj::foo, 2);
queue.push(this, &Obj::foo, 3);
単に呼び出すのと同じである必要があります
queue.push(this, &Obj::foo, 3);
これまでの私のコードは次のようになります。
Queue.h:
#pragma once
#include <functional>
#include <vector>
using std::vector;
using std::function;
using std::bind;
class Queue
{
private:
struct functioncall {
std::function<void()> call;
};
vector<functioncall> queue;
public:
Queue();
~Queue();
template<typename T, typename F, typename... Args>
int push(T, F , Args... args);
int pop();
bool empty();
size_t size();
};
template<typename T, typename F, typename... Args>
int Queue::push(T instance, F func, Args... args)
{
functioncall newelem = { bind(func, instance, args...) };
queue.push_back(newelem);
return queue.size();
}
Queue.cpp:
#include "Queue.h"
Queue::Queue() : queue()
{
}
Queue::~Queue()
{
delete &queue;
}
int Queue::pop()
{
if(!queue.empty())
{
queue.front().call();
queue.erase(queue.begin());
return queue.size();
}
return 0;
}
bool Queue::empty()
{
return queue.empty();
}
size_t Queue::size()
{
return queue.size();
}
結果を保存するだけでなく、呼び出されているメソッドへのポインターも保存して、そのポインターを探して古いエントリを削除しqueue
たい構造体を取得するためのベクトルを既に準備しました。std::bind
問題は、渡される関数がpush()
任意の量の引数を取ることができるということです。それを実行できる汎用ポインタータイプ(実行可能である必要はありません。同じ関数をキューに繰り返しプッシュする場合は同じです)はありますか?