Я внедряю систему времени выполнения задач, которая поддерживает буферы для пользовательских объектов различных типов.Кроме того, все объекты перед переносом сохраняются в буферах.Поскольку среда выполнения не знает типы объектов, которые будет предоставлять пользователь, классы Wrapper и Buffer являются шаблонными:
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) каждая задача должна сохранять ссылки на несколько буферов (это число неизвестно во время компиляции) 2) буферы разных типов (в зависимости от хранимого класса Buffer).3) задача должна использовать эти ссылки для доступа к буферам.
Нет смысла иметь базовый класс для класса Buffer, а затем использовать указатели базового класса, так как методы Write и Read из класса Buffer являются храмовыми итаким образом не может быть виртуальным.
Поэтому я думал сохранить ссылки как пустые указатели, где класс 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]);
}
...
};
Проблема в том, что я не знаю, как получитьдействительный указатель из пустого указателя для доступа к буферу.А именно, я не знаю, как сохранить тип объекта, на который указывают buffers [index] .
Можете ли вы помочь мне с этим или предложить какое-то другое решение?
РЕДАКТИРОВАТЬ: буферы являются только детали реализации системы времени выполнения, и пользователь не знает об их существовании.