std::default_constructible 用于模板化 class 参数
std::default_constructible for templated class parameter
我是 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::enable_if
在 class 模板上毫无意义。它对重载的函数模板很有用,但不太常见的是,它对 class 模板的部分特化很有用;这就是 SFINAE 适用的地方。
如果您只是想在 T
不是 default-constructible 时阻止 PoolAllocator
编译,请使用 static_assert
:
template<class T>
class PoolAllocator {
static_assert(std::is_default_constructible_v<T>,
"Parameter must be default-constructible");
// The rest of implementation here
};
我是 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::enable_if
在 class 模板上毫无意义。它对重载的函数模板很有用,但不太常见的是,它对 class 模板的部分特化很有用;这就是 SFINAE 适用的地方。
如果您只是想在 T
不是 default-constructible 时阻止 PoolAllocator
编译,请使用 static_assert
:
template<class T>
class PoolAllocator {
static_assert(std::is_default_constructible_v<T>,
"Parameter must be default-constructible");
// The rest of implementation here
};