Создать функцию constrexpr с поведением макросов - PullRequest
1 голос
/ 08 апреля 2020

У меня есть функция макроса, которая работает так, как вы ожидаете:

#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;
}

Возможно ли добиться такого поведения?

1 Ответ

1 голос
/ 08 апреля 2020

Краткий ответ: Нет.

Длинный ответ: Расширение макроса - это просто текстовое преобразование исходного кода. После преобразования определениями макросов исходный код «передается» компилятору для его компиляции. Таким образом, макросы раскрываются еще до того, как компилятор начал выполнять свою работу, в то время как constexpr функции выполняются во время компиляции. Следовательно, макросы и выражения constexpr - это две разные вещи.

...