【发布时间】:2021-02-07 10:03:49
【问题描述】:
我对 c++ 模板相当陌生,而且我意识到我可能正在做模板元编程。我想要的是实现以下定义:
#include <type_traits>
// T must be default-constructible
template<class T, std::enable_if<std::is_default_constructible<T>>>
class PoolAllocator
{
public:
PoolAllocator(unsigned int numItems);
~PoolAllocator();
T* Alloc();
void Free(T* item);
private:
struct mPoolItem
{
T item;
mPoolItem* next;
};
mPoolItem* mpPool;
mPoolItem* mpFreePointer; // points to the first free element or nullptr
};
我想在编译时检查提供的模板类型T 是否有默认构造函数,否则会导致编译错误。
我是否使用了正确的方法? 提前致谢。
【问题讨论】:
-
std::std::enable_if和元编程通常只在一种情况下有用。当您有多个要修剪的选项(类模板的特化或重载)时。如果我们有一个简单的类模板并且我们想要检查关于其类型的条件(不在选项之间进行选择,它要么是有效的要么是硬错误),我发现static_assert通常更适合我的需求。 -
好点!谢谢你。
static_assert将满足我的需求 -
你不能像那样使用
std::enable_if:你需要一个默认的模板参数。
标签: c++ class templates c++17 default-constructor