【发布时间】:2018-03-25 12:36:07
【问题描述】:
我想为任何编译时评估的参数(文字或来自 constexpr 表达式的东西)禁用函数。这可能吗?
对于整数,可以使用非类型模板参数做相反的事情,但这也会改变调用语法。
我正在玩弄严格的整数,这需要以某种方式启动。当前处理错误输入的规则:
如果源值仅在运行时已知,并且缩小转换会破坏解释(而不是位),则会引发异常
如果源值在编译时已知,但不适合,则应该出现编译错误。
我的想法是禁用为所有 constexpr 参数接受更广泛类型的构造函数。
严格来说,我的意思是只允许保值转换:
假设 N >= M
-
int<M>到int<N>总是好的 -
uint<M>到uint<N>总是好的
对于其他一切:
- 如果源值在编译时已知,则应该存在编译错误。
- 如果在编译期间不知道该值,请查看转换是否可以正常工作,否则抛出异常。
对于情况 (1),使用 constexpr-throw 技巧不起作用:考虑以下(非 constexpr 上下文):
// Will compile, but it shouldn't. Instead of not compiling it will throw an exception.
int<16> foo(12345);
// Will compile. Whatever the type of some_value_from_outside is,
// check that it fits at runtime. If it does not, throw an exception.
int<16> thisIsFine(some_value_from_outside);
理想的是 关于 constexpr 参数的重载解析,它不存在,所以我正在努力寻找最佳解决方法。
【问题讨论】:
-
我想说在你明显的需求背后还有另一个问题
-
您要解决的真正问题是什么。不,不是“仅针对编译时参数禁用函数”的问题,而是您认为解决方案必须是“仅针对编译时参数禁用函数”的真正问题。
-
请定义严格整数。我猜不出你的意思;或解释(或至少给出一些例子)什么是非严格整数。
-
即使是最新的编辑也不提供任何minimal reproducible example。我不明白
M和N是什么以及它们来自哪里。int<16>看起来很奇怪。你是说int16_t吗? -
@BasileStarynkevitch 抱歉标记错误。
标签: c++ typetraits