【发布时间】:2023-03-30 21:50:01
【问题描述】:
我有一个模板容器类,它需要将附加信息与用户指定类型的每个实例关联起来。
容器指定一个包装结构,包含指定的类型和附加信息...
template<typename T> class Container
{
...
struct Wrapper
{
T mType;
int mInfo;
};
}
在初始化时,容器会填充动态分配的 Wrapper 实例(即 Wrapper*)。用户可以 pop() 一个实例,容器将返回一个转换为 T*。用户可以 push() 一个实例,容器将把它转换回 Wrapper*。
如果可以默认构造数据类型,则此方法可以正常工作。然而,情况并非总是如此,我想让用户提供一个分配函数,在初始化期间调用,它可以构造它喜欢的数据类型。容器要求函数的特定签名是可以的。
template<typename T> template<typename F> void Container<T>::init(F allocator);
我正在努力解决的是如何在函数分配数据类型时分配 Wrapper。我考虑过使用placement new,容器为Wrapper分配足够的空间,并将地址传递给函数来做一个新的数据类型的placement。
有没有更清洁的方法来解决这个问题?
【问题讨论】:
-
最好写代码,然后解释类应该做什么。如果可以推送/弹出,为什么要创建实例?
-
只能推送/弹出属于容器的对象。也就是说,用容器需要的附加信息装饰的对象。用户看到 T*,而容器看到 Wrapper*。
-
我同意 BЈовић:最好还是写代码。但是,据我所知,您需要 Wrapper 中的构造函数来获取您的 T.
-
为什么不将
Wrapper::mType设为指向T的指针? -
是的,考虑过让 Wrapper 对 T 进行复制构造,但不想要求 T 是可复制构造的。
标签: c++ wrapper placement-new