0 / 0 / 0
Регистрация: 08.08.2014
Сообщений: 21
|
||||||
1 | ||||||
Рекурсивный вызов constexpr функции17.11.2019, 13:52. Показов 1039. Ответов 10
Метки нет Все метки)
(
Приветствую уважаемые форумчане. Возможно ли реализовать указанное в теме телодвижение, с условием передачи в качестве входного параметра в каждой итерации нового объекта. Насколько я понимаю, есть ограничение по возможным типам, да? Интегральные типы вроде проходят. Пример который пытаюсь завести:
0
|
|
17.11.2019, 13:52 | |
Ответы с готовыми решениями:
10
Рекурсивный вызов функции main
рекурсивный вызов функции-члена Используя рекурсивный вызов функции вычислить сумму заданного числа элементов ряда |
18470 / 9627 / 2356
Регистрация: 30.01.2014
Сообщений: 16,881
|
||||||
17.11.2019, 14:09 | 2 | |||||
Martmath, честно говоря, там где у вас написано "работает", тоже не работает, потому что берете адрес временного объекта. Например так:
Лучше опишите внятно словами что вы хотите сделать.
1
|
Комп_Оратор)
![]() |
|
17.11.2019, 14:20 | 3 |
Martmath, не видно оператора сравнения который это сможет. Вообще, вопрос ни как не понятен. Глядя во тьму могу произнести следующее:
Рекурсия времени компиляции возможна и лежит в основе многих современных приёмов и типов. Но она требует быть вычислимой на стадии компиляции.
0
|
0 / 0 / 0
Регистрация: 08.08.2014
Сообщений: 21
|
|
17.11.2019, 15:27 [ТС] | 4 |
Благодарю за внимание:
Возможно ли в ТЕЛЕ constexpr функции создать(или изменить существующий constexpr) объект времени компиляции. После, в этом же теле, запихнуть рекурсивно в нее же (ну или, хотя бы, в другую constexpr функцию) данный обьект в качестве входного параметра. Все примеры из инета, в основном, крутятся вокруг интергальных типов а-ля int: собственно пример ниже из моего кода (с рекурсивным листом) вполне себе отрабатывает. С обьектами - глуховато ((. Вот тут template_parameters пишут про "...a pointer type (to object or to function);... " вот собственно "a pointer type to object" и интересен. Добавлено через 8 минут ...если бы получилось без макросов (я про BOOST_PP_SEQ_FOR_EACH_I и BOOST_PP_SEQ_ENUM) было бы здорово... Добавлено через 24 минуты Извиняюсь за "мутную" формулировку - насколько я понял, для подобного рода задачи, в возвращаемом в конечной итерации значении должны быть "места" для всех "темповых" переменных используемых в предыдущих итерациях?
0
|
18470 / 9627 / 2356
Регистрация: 30.01.2014
Сообщений: 16,881
|
|
17.11.2019, 16:59 | 5 |
Компилируемость кода каким-то конкретным компилятором еще не означает его работоспособность. Это можно вышить золотыми буквами и где-нибудь повесить, чтобы никогда об этом не забывать.
Кроме того, есть и другие компиляторы, которые закономерно этот код не компилируют. Смотря в каком контексте. Только это опять не описание задачи, а описание того, как вы хотели бы ее решать. Скорее всего вам не нужны списки объектов, а нужны списки типов. Естественно. В этом и заключается ошибочность вашего кода. Извините, только вот "задачи" опять не видно здесь. Видно набор инструментов, который вы пытаетесь пристроить так и сяк, но непонятно зачем.
2
|
0 / 0 / 0
Регистрация: 08.08.2014
Сообщений: 21
|
||||||
17.11.2019, 22:44 [ТС] | 6 | |||||
Собственно задача, из constexpr массива получить constexpr массив (вектор тоже норм) с уникальными элементами: ...
0
|
Вездепух
![]() ![]() 11181 / 6124 / 1677
Регистрация: 18.10.2014
Сообщений: 15,421
|
|
17.11.2019, 23:07 | 7 |
Это потому, что вы на самом деле не "выбрали стандарт". Чтобы компилятор от Микрософт старался соответствовать стандарту, вам необходимо его об этом попросить. Как минимум выключив нестандартные расширения в настройках проекта и включив "Conformance mode".
0
|
18470 / 9627 / 2356
Регистрация: 30.01.2014
Сообщений: 16,881
|
||||||
17.11.2019, 23:24 | 8 | |||||
Вот это возможно
когда у нас указатель на объект со статическим классом хранения, например
0
|
0 / 0 / 0
Регистрация: 08.08.2014
Сообщений: 21
|
||||||
17.11.2019, 23:46 [ТС] | 9 | |||||
Извиняюсь, но наверное имеется ввиду static Tp obj; ?
Кстати пробовал делать локальные static обьекты:
Глобальные да, глобальные - ок.
0
|
18470 / 9627 / 2356
Регистрация: 30.01.2014
Сообщений: 16,881
|
||||||
18.11.2019, 00:14 | 10 | |||||
static тоже подходит. Но имелось в виду то, что имелось.
Статический класс хранения в С++ у глобальных, статических в классе и статических в функции переменных. Ознакомьтесь с терминологией. В constexpr функциях это не допускается. Добавлено через 5 минут Martmath, я бы на вашем месте не связывался с constexpr объектами, а сделал бы последовательность чисел на базе std::integer_sequence с возможность преобразовать в std::array при надобности Вроде такого:
arr .
0
|
0 / 0 / 0
Регистрация: 08.08.2014
Сообщений: 21
|
||||||
20.11.2019, 21:55 [ТС] | 11 | |||||
Приветствую. Вроде получилось..возможно даже "стильно, модно, молодежно". Микрософт С++ 17 (vs 2019) со всеми расширениями:
0
|
20.11.2019, 21:55 | |
20.11.2019, 21:55 | |
Помогаю со студенческими работами здесь
11
Считать одномерный массив с файла, отсортировать его использую рекурсивный вызов функции Вызов constexpr метода, внутри класса в котором метод и объявлен Constexpr функции Рекурсивный вызов рекурсивный вызов мейн Присваивание constexpr к non-constexpr Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |