【问题标题】:std::default_constructible for templated class parameterstd::default_constructible 用于模板类参数
【发布时间】: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


【解决方案1】:

std::enable_if 在类模板上毫无意义。它对于重载的函数模板很有用,而对于类模板的部分特化则不太常见;这就是 SFINAE 适用的地方。

如果您只是想阻止PoolAllocatorT 不是默认可构造的情况下编译,请使用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
};

【讨论】:

    猜你喜欢
    • 2018-08-03
    • 1970-01-01
    • 2016-04-12
    • 2018-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多