使用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 表达式不能是非类型模板参数
- 函数参数中使用的复杂文字'i'
- 将文字作为const-ref参数传递
- 显式(布尔值)可以作用于字符文字参数的长度吗?
- 为什么对字符串参数的常量引用可以采用字符串文字?
- 使用constexpr验证构造函数中的文字参数
- C++ 当数字文字是参数时,最令人烦恼的解析?
- C++17 类模板参数推导指南和字符串文字
- 用户定义的文字与UINT64_T参数相结合
- 字符串文字扣除模板参数
- 在C++中运行 CMD 行 使用变量(不是字符串文字)作为参数
- 作为预处理器宏参数的多行原始字符串文字
- 字符串文字的模板参数扣除
- _mm_extract_epi8(..) 内部函数,采用非文字整数作为参数
- 当将负文字作为无符号参数传递时,可以g++警告
- 字符串文字作为模板参数
- 模板非类型参数,C++11,对字符串文字的限制
- 用户定义的文字参数不是constexpr