我想创建一个静态类,它将充当固定大小的内存分配器。
让我们看看这个简单的例子:
struct A {};
struct B {};
template<class T, std::size_t MaxNumObjects>
class InternalContainer
{
public:
static constexpr std::size_t maxObjects = MaxNumObjects;
static T* createObject()
{
return ::new(&objects[idx++]) T;
}
static T* releaseObject() { /*...*/ };
private:
using buffer_t = std::aligned_storage_t<sizeof(T), alignof(T)>;
static buffer_t objects[maxObjects];
static std::size_t idx;
};
A* a = InternalContainer<A, 2>::createObject();
B* b = InternalContainer<B, 5>::createObject();
如何根据类型预定义容器的最大大小?
// will be replaced "InternalContainer<A, 2>"
A* a = MyContainer<A>::createObject();
// will be replaced "InternalContainer<B, 5>"
B* b = MyContainer<B>::createObject();
我尝试过这样的方法,但它不起作用:
template<class T>
using MyContainer = InternalContainer<A, 2>;
template<class T>
using MyContainer = InternalContainer<B, 5>;
2条答案
按热度按时间gojuced71#
这可以通过显式地专门化变量模板来轻松实现,例如:
godbolt example
f0ofjuux2#
如何根据类型预定义容器的最大大小?
你有几个选择。最简单的方法是为默认类型提供专门化(即
A
、B
)See live demo in godbolt.org
或者,使用
if constexpr
(需要c++17或更高版本),您可以执行以下操作:See live demo in godbolt.org
或者,使用
std::conditional_t
,您还可以执行以下操作:See live demo in godbolt.org