как проверить, что члены массива const монотонно растут во время компиляции
Фантастический ответ уже c++ дан. Просто как дополнительное constexpr примечание:
Начиная с C++20, некоторые c++ функции в библиотеке алгоритмов constexpr-function теперь также имеют реализацию c++ constexpr
. Сюда входят std::adjacent_find
. И это тоже constexpr в версии "ranges".
Решение constexpr-function вашей проблемы почти дано constexpr-function в справочнике cpp here с использованием constexpr-function std::ranges::adjacent_find
.
В примере используется std::ranges::greater
в constexpr-function качестве предиката, который constexpr-function позволяет повторять значения, что constexpr приводит к нестрогому порядку.
Итак, нам constexpr-function нужно использовать std::ranges::greater_equal. Это cxx также автоматически выведет constexpr-function типы параметров оператора cxx вызова функции из аргументов, что c++ немного упростит жизнь.
Код constexpr-function может выглядеть примерно c++ так:
#include
#include
#include
#include
#include
namespace rng = std::ranges;
template
constexpr bool increasingValues(T(&a)[N]) noexcept {
return (rng::end(a) == rng::adjacent_find(a, rng::greater_equal()));
}
constexpr int arr[] = { 10, 20, 20, 40, 50};
static_assert(increasingValues(arr), "Array values are not increasing");
int main() {
std::cout << *(std::end(arr) - 1)<< '\n';
}
В Microsoft Visual Studio c++ редактор уже показал бы проблему.
И c++ компилятор выдаст 2 сообщения c++ с понятной подсказкой.
См. снимок cxx экрана ниже:
.
.
.
Кстати, принятый cpp ответ компилируется, как cxx показано ниже
А с фиксацией cxx на constexpr
мы видим:
c++
constexpr
constexpr-function
как проверить, что члены массива const монотонно растут во время компиляции
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.