Информация об изменениях

Сообщение Re[2]: Concept equality preservation от 26.02.2024 21:38

Изменено 26.02.2024 22:11 rg45

Re[2]: Concept equality preservation
Здравствуйте, Кодт, Вы писали:

К>Поэтому во время компиляции нам наплевать, изменяются ли значения. Компилятор вообще не оперирует значениями.

К>(Хотя! Если мы туда присобачим какие-нибудь constexpr функции... Надо проверить!)

Ну а почему нет?

http://coliru.stacked-crooked.com/a/74d67fe96e7cc04a

template <auto expected, auto f, auto...args>
concept ExpectEqual = (expected == f(args...));

constexpr size_t factorial(size_t x) { return x > 0 ? x * factorial(x - 1) : 1; }

static_assert(ExpectEqual<1, factorial, 0>);
static_assert(ExpectEqual<1, factorial, 1>);
static_assert(ExpectEqual<2, factorial, 2>);
static_assert(ExpectEqual<6, factorial, 3>);
static_assert(ExpectEqual<24, factorial, 4>);
static_assert(ExpectEqual<120, factorial, 5>);
static_assert(ExpectEqual<720, factorial, factorial(3)>);

static_assert(!ExpectEqual<0, factorial, 0>);


Компайл-тайм юнит-тесты
Re[2]: Concept equality preservation
Здравствуйте, Кодт, Вы писали:

К>Поэтому во время компиляции нам наплевать, изменяются ли значения. Компилятор вообще не оперирует значениями.

К>(Хотя! Если мы туда присобачим какие-нибудь constexpr функции... Надо проверить!)

Ну а почему нет?

http://coliru.stacked-crooked.com/a/80f1f5a269b4f138

template <auto expected, auto f, auto...args>
concept ExpectEqual = (expected == f(args...));

template <auto expected, auto f, auto...args>
concept ExpectNotEqual = !ExpectEqual<expected, f, args...>;

constexpr size_t factorial(size_t x) { return x > 0 ? x * factorial(x - 1) : 1; }

static_assert(ExpectEqual<1, factorial, 0>);
static_assert(ExpectEqual<1, factorial, 1>);
static_assert(ExpectEqual<2, factorial, 2>);
static_assert(ExpectEqual<6, factorial, 3>);
static_assert(ExpectEqual<24, factorial, 4>);
static_assert(ExpectEqual<120, factorial, 5>);
static_assert(ExpectEqual<720, factorial, factorial(3)>);

static_assert(ExpectNotEqual<0, factorial, 0>);
static_assert(ExpectNotEqual<7, factorial, 3>);
static_assert(ExpectNotEqual<1, factorial, 1, 2, 3, 4, 5>);


Компайл-тайм юнит-тесты