使用 constexpr 验证构造函数中的文字参数
Using constexpr to validate literal parameters in constructor
我开始尝试 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>{}};
我开始尝试 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>{}};