其他分享
首页 > 其他分享> > c – 使用constexpr验证构造函数中的文字参数

c – 使用constexpr验证构造函数中的文字参数

作者:互联网

我开始尝试constexpr.
我想要实现的是验证文字数值
作为ctor参数提供.
我开始使用以下内容,如果构建MyStruct则抛出
值<= 4.

constexpr int validate(int v)
{
  return (v > 4) ? v : throw exception();
};

struct MyStruct final
{
  constexpr MyStruct(const int v)
    : _v{validate(v)}
  {
  }

  void add(int toAdd)
  {
    _v += toAdd;
  }

  int _v;
};

int main(int argc, char**)
{
  constexpr MyStruct a{500};  // ok so far...
  a.add(argc);                // ...nope 
  MyStruct b{500};            // check at runtime :(
  MyStruct c{argc};           // runtime check ok
}

将myStruct标记为constexpr按预期工作,但这会阻止调用add,因为它不可变.

我认为这可以完成,因为我只针对文字值(在编译时已知).
我想避免使用模板.

解决方法:

函数参数不是const表达式: – /

你可以传递std :: integral_constant< std :: size_t,4u>允许在构造函数内部进行编译时检查:

struct MyStruct final
{
    // For runtime or constexpr usage.
    constexpr MyStruct(int v) : _v{validate(v)} {}

    // For compile-time values
    template <std::size_t N>
    constexpr MyStruct(std::integral_constant<std::size_t, N>) : _v{N}
    {
        static_assert(N > 4, "Unexpected");
    }

    // ...
};

然后

MyStruct b{std::integral_constant<std::size_t, 500>{}};

标签:c,validation,constexpr,c17,if-constexpr
来源: https://codeday.me/bug/20190828/1752496.html