如何在禁用异常的情况下从constexpr函数断言?

时间:2016-02-03 19:48:51

标签: c++ c++11 exception metaprogramming constexpr

如果我想在小型处理器嵌入式设计中断言来自C ++ 11 constexpr函数的检测到错误,关闭中断会消除建议的处理错误的方法(参见eric nieblers answer here

这是一个简短的代码示例:

constexpr bool isANumber(char c)
{
    return (c >= '0' && c <= '9');
}

constexpr int charToInt(char c)
{
    return (!isANumber(c))? throw std::logic_error("not a number"):
        c - '0';
}

据我所知:

  • 不允许使用static_assert,因为输入可以是运行时间值
  • 断言可能强制该函数被运行时评估,并且断言处理程序拖入太多的东西,它将溢出大多数Cortex芯片的闪存
  • throw将无效,因为我关闭了异常

有什么工作?

注意:在超级资源受限的嵌入式环境中使用C ++必须关闭异常,因为它们使用多余的RAM(例如我的芯片只有16K RAM)。这是常见的做法。

1 个答案:

答案 0 :(得分:2)

我找到了特殊情况的解决方法,您可以保证在运行时永远不会调用constexpr函数。在这种情况下,您可以强制执行非常量评估错误。

int assert_failed() {
    static int i = 5;
    return i++;
}
constexpr int cheap_assert(bool i) {
    return i == 1 ? 0 : assert_failed();
}

constexpr unsigned operator""_my_literal(const char* s, std::size_t size) {
    return cheap_assert(size < 10), 0;
}