sfinae远离析构函数

Nic*_*ick 6 c++ sfinae constexpr c++14

我正在实现一些非常类似std::vector但在堆栈上使用数组而不是内存分配的东西.

d-tor调用使用SFINAE的函数.

  • 如果value_type是POD功能有空体.
  • 如果value_type是正常类std::string,则函数有一个正文并正确销毁所有数据.

现在,我希望能够使用这个新std::vectorconstexpr.然而,即使c-tor被声明constexpr,代码也不会编译,因为类有非平凡的d-tor.

这是代码的一小部分:

template<typename T, std::size_t SIZE>
class SmallVector{
    constexpr SmallVector() = default;

    ~SmallVector(){
        destructAll_<value_type>();
    }

    // ...

    template<typename X>
    typename std::enable_if<std::is_trivially_destructible<X>::value == true>::type
    destructAll_() noexcept{
    }

};
Run Code Online (Sandbox Code Playgroud)

constexpr如果value_type是POD并保持非POD数据类型的功能,我可以做什么来使类成为可能.
(当然不是在同一时间)

bol*_*lov 7

遗憾的是,无法使用SFINAE启用/禁用析构函数,也无法使用未来的概念.这是因为destructos:

  • 无法模板化
  • 不能有参数
  • 不能有返回类型

你可以做的是专门化整个类,或者更好的是,创建一个只包含构造/破坏和基本访问的基类,并将其专门化.

template <class T, class Enable = void>
struct X {
    ~X() {}
};

template <class T>
struct X<T, std::enable_if_t<std::is_pod<T>::value>> {
};

static_assert(std::is_trivially_destructible<X<int>>::value);
static_assert(!std::is_trivially_destructible<X<std::vector<int>>>::value);
Run Code Online (Sandbox Code Playgroud)