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

Using constexpr to validate literal parameters in constructor

本文关键字:文字 参数 构造函数 constexpr 验证 使用      更新时间:2023-10-16

我开始尝试constexpr
我要实现的目标是验证literal数值作为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>{}};