创建具有宏行为的 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
表达式是两个不同的东西。
我有一个宏函数,它的工作方式与您预期的一样:
#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
表达式是两个不同的东西。