私は、さまざまなタイプのユーザー提供オブジェクトのバッファを管理するタスクランタイムシステムを実装しています。さらに、すべてのオブジェクトはバッファに格納される前にラップされます。 、テンプレートクラスのインスタンスへのポインタのベクトル
template <typename T>
class Wrapper {
private:
T mdata;
public:
Wrapper() = default;
Wrapper(T& user_data) : mdata(user_data) {}
T& GetData() { return mdata; }
...
};
template <typename T>
class Buffer {
private:
std::deque<Wrapper<T>> items;
public:
void Write(Wrapper<T> wd) {
items.push_back(wd);
}
Wrapper<T> Read() {
Wrapper<T> tmp = items.front();
items.pop_front();
return tmp;
}
...
};
今、ランタイムシステムは、タスクを処理するのは、それぞれのサブセットで動作:ランタイムは、ユーザーが提供するオブジェクトのタイプを知らないので、ラッパーおよびバッファクラスがテンプレート化されています前述の緩衝液。したがって、各バッファは1つ以上のタスクによって操作される。これは、タスクがバッファを共有する可能性があるため、タスクがバッファへの参照を保持しなければならないことを意味します。
私の問題がどこにあるか。これは、次のとおりです。 1バッファがtempletedバッファクラスに基づいて、異なる種類(である) 2(この数は、コンパイル時には不明です)各タスクがバッファの数への参照を維持する必要があります) )。 3)タスクは、これらの参照をアクセスバッファに使用する必要があります。
バッファクラスに基本クラスを持っているし、その後メソッドはバッファクラスからと読むを書くので、基底クラスのポインタを使用するためにはポイントがありませんがtempletedされているので、仮想することはできません。
だから私は、Taskクラスは、次のようになります場合は、無効ポインタとしての参照を維持するために考えていた:
class Task {
private:
vector<void *> buffers;
public:
template<typename T>
void AddBuffer(Buffet<T>* bptr) {
buffers.push_back((void *) bptr);
}
template<typename T>
Buffer<T>* GetBufferPtr(int index) {
return some_way_of_cast(buffers[index]);
}
...
};
これに伴う問題は、私はからの有効なポインタを取得する方法がわからないということですバッファにアクセスするには、voidポインタを使用します。つまり、私はバッファが指し示すオブジェクトの型を保持する方法を知らない[インデックス]。
これを手伝ったり、他の解決方法を提案できますか?
EDIT:バッファはランタイムシステムの実装の詳細のみであり、ユーザーはその存在を認識していません。
ええと、私はこれがテンプレートではうまくいかないと思います。実行時間が多すぎる多態性が必要です。私は頭の中から2つのオプションを提案したいと思います:1.サブタイプポリモーフィズムをどこにでも使い、 'Task'クラスが必要とするすべてのものを提供する一般的な抽象基本クラスから型を継承させます。 2.ブースト。しかしどちらも本当に満足です。 – Philipp
@Philipp私はシステムを意図しているので、ユーザーはタスク領域を定義し、どの変数が各タスクにとって特別な関心事であるかを宣言するという点でのみ、通常のプログラムとは異なるプログラムを書くべきです。これらの変数は、Wrapperテンプレートを使用してラップする必要があります。これはオプションのコンパイル時および実行時のチェックをサポートします。したがって、私はユーザーにコードをさらに複雑にすることを強いられません。代わりに私はそれを隠したいと思う。そして当分の間、私はブーストを避けたいと思います。 –
Diggy
@perreal基本的に、タスクの実行が開始されると、関連する各バッファから単一のオブジェクトを取得する必要があります。たとえば、* GetBufferPtr *関数の* some_way_of_cast *。ランタイムはデータそのものを気にする必要はありませんが、私はバッファ参照の任意の数があり、各バッファには任意の種類のデータが格納されていると思います。私はタスククラスでこれをエンコードする方法を探しています。 – Diggy