繁体   English   中英

如何将static_assert引入模板变量定义中

[英]How to introduce static_assert into template variable definition

如何将static_assert引入模板变量定义中?

我的尝试是使用lambda函数:

#include <type_traits>
#include <utility>

#include <cstdlib>

namespace
{
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wglobal-constructors"

template< typename F >
F f = ([] () { static_assert(std::is_default_constructible< F >{}); }(), F{});

#pragma clang diagnostic pop
}

struct L
{
    L() = default;
    L(L const &) = delete;
    L(L &&) = delete; 
};

int
main()
{
    static_cast< void >(f< L >);
    return EXIT_SUCCESS;
}

但是对于不可移动的对象,不可能以这种方式构造值对象。

使用逗号运算符,我无法以F f = ([] () { static_assert(std::is_default_constructible< F >{}); }(), {});形式执行值初始化F f = ([] () { static_assert(std::is_default_constructible< F >{}); }(), {});

我不能使用形式为, typename = decltype([] () { static_assert(std::is_default_constructible< F >()); })附加模板参数,因为它是lambda expression in an unevaluated operand的错误lambda expression in an unevaluated operand

解决方案不是通过SFINAE禁用实例化。 我确实需要static_assert明确地告诉用户有关错误的信息。

如果static_assert返回voidbool会很好。

template<typename T>
struct require_default_constructible {
  static_assert(std::is_default_constructible<T>{}, "is default constructible");
  using type = T;
};

namespace
{
template< typename F >
  typename require_default_constructible<F>::type f{};
}

因此,检查直接出现在变量模板中:

template<typename T, bool B>
struct check {
  static_assert(B, "???");
  using type = T;
};

namespace
{
template< typename F >
  typename check<F, std::is_default_constructible<F>::value>::type f{};
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM