gpt4 book ai didi

c++ - 指向模板类实例的指针 vector

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:08 25 4
gpt4 key购买 nike

我正在实现一个任务运行时系统,该系统为用户提供的各种类型的对象维护缓冲区。此外,所有对象在存储到缓冲区之前都被包装。由于运行时不知道用户将提供的对象类型,因此 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 类的基类然后使用基类指针是没有意义的,因为 Buffer 类的方法 WriteRead 是模板化的,因此不能是虚拟的。

所以我想将引用保留为空指针,其中 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 指针中获取有效指针以访问 Buffer。也就是说,我不知道如何保留 buffers[index] 指向的对象的类型。

你能帮我解决这个问题,或者建议一些其他解决方案吗?

编辑:缓冲区只是运行时系统的实现细节,用户不知道它们的存在。

最佳答案

根据我的经验,当用户类型保存在用户代码中时,处理缓冲区的运行时系统不需要担心这些缓冲区的实际类型。用户可以在类型化缓冲区上调用操作。

    class Task {
private:
vector<void *> buffers;
public:
void AddBuffer(char* bptr) {
buffers.push_back((void *) bptr);
}

char *GetBufferPtr(int index) {
return some_way_of_cast(buffers[index]);
}
...
};

class RTTask: public Task {
/* ... */
void do_stuff() {
Buffer<UserType1> b1; b1Id = b1.id();
Buffer<UserType2> b2; b2Id = b2.id();

AddBuffer(cast(&b1));
AddBuffer(cast(&b2));
}
void do_stuff2() {
Buffer<UserType1> *b1 = cast(GetBufferPtr(b1Id));
b1->push(new UserType1());
}
};

在这些情况下,强制转换在用户代码中。但也许你有不同的问题。此外,如果您可以切换到指针,则可能不需要 Wrapper 类。

关于c++ - 指向模板类实例的指针 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9507652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com