Условно переменная constexpr - PullRequest
       11

Условно переменная constexpr

2 голосов
/ 11 декабря 2019

У меня есть куча тестов для проекта, которые изначально были написаны с использованием Gtest, но с тех пор я переместил их в CppUnitTestFramework от Microsoft. Чтобы избежать необходимости переписывать все мои тесты, я создал макросы, которые следуют тому, как GTest выполняет свои тесты - например, EXPECT_EQ.

Теперь я пытаюсь устранить все предупреждения, сгенерированные MsBuild, в том числе анализ кода, которые касаются использования constexpr, если оно доступно. В тестах их довольно много, поскольку ожидаемое значение обычно является литералом, хотя и не всегда. Итак, у меня есть свой EXPECT_EQ, который выглядит следующим образом:

#define EXPECT_EQ( x, y ) { const auto _x = (x); const auto _y = (y); if ( _x == _y ) {} else { Assert::Fail(createFailMessage( _x, L" == ", _y ).c_str(), LINE_INFO() ); } }

Это прекрасно работает;однако, если он вызывается с EXPECT_EQ( 7, getTime() ), я получаю предупреждение о том, что _x может быть constexpr.

Я знаю, что могу просто создать отдельный макрос, например:

#define EXPECT_CEQ( x, y ) { constexpr auto _x = (x); const auto _y = (y); if ( _x == _y ) {} else { Assert::Fail(createFailMessage( _x, L" == ", _y ).c_str(), LINE_INFO() ); } }

Однако, если я вернусь к GTest позже, мне придется исправить все мои тесты, чтобы изменить EXPECT_CEQ на EXPECT_EQ.

Итак, мой вопрос: возможно ли объединить эти два макроса, чтобы сделать _x условно constexpr в зависимости от того, может ли оно быть constexpr?

PS: Да, я знаю, макросы плохие.

...