创建具有宏行为的 constrexpr 函数

Create constrexpr function with macro behaviour

我有一个宏函数,它的工作方式与您预期的一样:

#define PRECONDITION(testBool) ( !(testBool) ?              \
    ( fprintf(stderr, "%s:%i: Precondition '%s' failed.\n", \
              __FILE__, __LINE__, #testBool),               \
      exit(1) ) : void(sizeof(0)) )

太棒了,因为我可以创建漂亮的断言:

PRECONDITION(5 > 6); // prints "<file>:<line>: Precondition '5 > 6' failed."

虽然这行得通,但我正在努力学习一种更好、更现代的方法, 使用 constexpr,所以我可以有类型安全,使用 std::err <<。 但是,我无法找到说明如何执行此操作/是否执行此操作的来源 实际上是可能的,所以我在这里问。我的形象是这样的:

constexpr void PRECONDITION(bool testBool)
{
    if(testBool) { return; }
    std::cerr << __SOME_MAGIC__ << ":" << __SOME_MAGIC__ << ":"
        << "Precondition '" << __SOME_MAGIC__ << "' failed." << std::endl;
}

是否可以实现这种行为?

简答:没有

长答案:宏扩展只是源代码的文本转换。一旦通过宏定义转换,源代码就"given"交给编译器编译。因此,宏在编译器开始工作之前就已扩展,而 constexpr 函数在编译时执行。因此,宏和 constexpr 表达式是两个不同的东西。