LINUX.ORG.RU

Рассчёт массива чисел Фибоначчи в compile-time C++

 , ,


1

4

На примере задачи о числах Фибоначчи хочу освоить программирование на плюсовых шаблонах. Задача - найти n-ное число Фибоначчи. Когда n известно, никаких проблем нет, решение понятно:

template<int n>
class Fibonacci {
public:
    static const int value = Fibonacci<n-1>::value + Fibonacci<n-2>::value;
};

template<>
class Fibonacci {
public:
    static const int value = 1;
};

template<>
class Fibonacci {
public:
    static const int value = 1;
};

Но n в момент компиляции неизвестно, известно лишь, что оно не больше 45. Поэтому я хотел бы насчитать все числа до 45-го и забить в массив, а потом выдать n-ное. Как это реализовать на шаблонах или constexpr?


Ответ на: комментарий от anonymous

У тебя есть альтернатива кде? Ну выкати - я посмеюсь.

Понимаешь - не важно кто я, важно кто ты в сравнении со мною. Если ты что-то утверждаешь, в чём-то обвиняешь меня без оснований, принимая за основание вес своих слов, то ты должен что-то из себя представлять.

Представляешь - ты можешь рассуждать на тему, обвинять кого-то и прочее. Без этого смысла никакого в твоих словах нет. Ты должен доказывать и обосновывать каждый свой выхлоп, как выводить и обосновывать следствие из него.

AnonCxx
()
Ответ на: комментарий от AnonCxx

Типов нет,

При том что система типов в common lisp уж точно превосходит c++ и c.

Есть объективный факт - лисп мёртв. И ни один его апологет так и не смог написать на нём ничего, кроме лабы.

StumpWM, который я использую и в который пару раз контрибутил, axiom, mirai, common music, openmusic, куча всего. Но конечно, лисп-хейтеры просто это не замечают.

Сам я написал аудио-плеер (тривиально - да, но тем не менее), который может играть flac и wv (у меня 90% музыки в flac формате, и ещё 5% в wv, остальное ape и mp3, так что выбор оправдан). Но в отличие от остальных он и демонизируется, и парсит внешние cue файлы. Всё, даже декодер, написан на CL.

Даже профайлер я написал на common lisp + C.

/shamazmazum на гитхабе

just-one-question
()
Ответ на: комментарий от AnonCxx

Так что всех этих «лисп мертв», «а что вы сами на нём написали» я вдоволь наслушался. И сам на нём написал не много, но и не мало. Причём не тупо в роли рабочего-быдлокодера, а сам для себя и для других, многое с нуля.

just-one-question
()
Ответ на: комментарий от AnonCxx

Понимаешь - не важно кто я, важно кто ты в сравнении со мною. Если ты что-то утверждаешь, в чём-то обвиняешь меня без оснований, принимая за основание вес своих слов, то ты должен что-то из себя представлять.

ЧСВ c++ кодера в действии?

just-one-question
()
Ответ на: комментарий от just-one-question

Сам я написал аудио-плеер (тривиально - да, но тем не менее), который может играть flac и wv (у меня 90% музыки в flac формате, и ещё 5% в wv, остальное ape и mp3, так что выбор оправдан). Но в отличие от остальных он и демонизируется, и парсит внешние cue файлы. Всё, даже декодер, написан на CL.

Это не доказывает нужность лиспа. А вот это

Всё, даже декодер, написан на CL.

просто разогрев процессора, ничем не оправданный кроме желания поиграться с лиспом.

Ладно бы еще экспертные системы какие привел в пример, системы компьютерной алгебры. Но сейчас даже для maxima есть хорошие альтернативы не на лиспе.

curufinwe ★★★★★
()
Ответ на: комментарий от AnonCxx

У тебя есть альтернатива кде?

Лол! Какой нахрен код! Вымести эту домохозяйку из /development поганой метлой. Ни один уважающий себя разработчик с таким дерьмом как KDE связываться не будет.

anonymous
()
Ответ на: комментарий от curufinwe

просто разогрев процессора, ничем не оправданный кроме желания поиграться с лиспом.

Я не игрался, а писал нужную мне программу. На с++ я бы вряд ли это сделал. Ты вот щас тут сидишь, не процессор греешь? Кому я обязан писать на лиспе именно те программы, а не эти?

just-one-question
()
Ответ на: комментарий от just-one-question

При том что система типов в common lisp уж точно превосходит c++ и c.

Ога, то чего нет превосходит то, что есть. Систему типов крестов не превосходит никто и никогда.

StumpWM

Это убожество просто смешно. Тебе не стыдное его упоминать? Это обычная обёртка на иксами в которой нет даже декоратора окон и гуйни. Очередной убогий эмулятор терминала, который почему-то вдруг назвали ВМ.

axiom

Обычная гуйня, ничего из себя не представляет. Такую скриптуху можно писать хоть на брайнфаке.

Сорцы с сайта не качаются.

mirai

О боже, дак это паста из википедии. Ну ты молодец, молодец. Совсем не палишься.

common music

C++

openmusic,

Какая-то неведомая поделка.

куча всего

И поэтому ничего, кроме пасты с википедии ты не предоставил, при этом весь этот софт уровня студподелок и ничего из себя не представляет как технически, так и функционально.

Но конечно, лисп-хейтеры просто это не замечают.

Я С++хейтер, но в отличии от блаженных верующих - я не настолько болен, чтобы спорить с действительностью.

То, что ты выклал тонну(пасту с википедии) протухшей гуйни, которая ни в коем разе не является конкурентом С++-гуйни - это ничего не доказывает и из этого ничего не следует.

У лиспа тонна фанатиков которые генерирует тонны поделок, но как было есть и будет всегда - эти поделки ничего и никогда из себя представлять не будет.

Сам я написал аудио-плеер (тривиально - да, но тем не менее), который может играть flac и wv (у меня 90% музыки в flac формате, и ещё 5% в wv, остальное ape и mp3, так что выбор оправдан).

Обычный хелворд.

Но в отличие от остальных он и демонизируется, и парсит внешние cue файлы.

Нахрена мне нужна демонизация? В демонизацию может и deadbeef вроде - никогда не было нужно. Ну то, что она парсит cue в 2016 - это конечно достижение.

Единственное что ты доказал - на cl можно написать примитивную гуйню, которая по словам автора будет работать. При этом её можно написать на чём угодно - нахрена нужен cl? Почему не брейнфак?

Всё, даже декодер, написан на CL.

Декодер сам по себе ничего не стоит - стоит его качество. А качество у тебя в районе нуля.

Даже профайлер я написал на common lisp + C.

Не профайлер, а «профайлер» и это мягко ещё сказано. Сравни эту убогую поделку с perf.

В конечном итоге налицо тотальное нарушение восприятия действительности. Такой свойственно всем сектантам, когда оценка действия не производится, а только факт его наличия.

Написать что-то не стоит ничего. Написать это вменяемое - стоит всё. Уже тысячи лет как оценивается только технологичность.

Строили дома, мосты, телеги, колёса, счёты тысячи лет назад и если сейчас какой-то адепт выкатит телегу из дерьма и скажет «смотри как я могу» - нам ним только посмеются.

Но в мире программирования здравого смысла нет - здесь какое-то зазеркалье. Все яро пытаются не замечать технологичность и качество чего-то - только факт наличия.

Это либо деградация, либо просто свойство того, что область находится на зачаточном уровне развития.

AnonCxx
()
Ответ на: комментарий от just-one-question

Твои потуги не имеют смысла в реальном мире. Мне лень объяснять примитивные вещи всяким сектантам.

Я тебе уже приводил пример. Твои потуги примерно равные ору деда, который сваял из дерьма и остатков запора в деревне корыто на телеге и орёт «нахрен мазерати», говоря «моя телега то же едет».

Интел не нужен, ибо я смог собрать «процессор» на рассыпухе. И прочие оры кулладептов.

Когда до вас добёртся развитие и ты осознаешь наличие критериев к оценке чего-либо кроме его факта наличия - ты всё поймёшь, а пока это бессмысленно.

Напиши себе броузер на лиспе - что же ты используешь декораторы окон и окна из гтк? Давай на лиспе. После тщетных попыток придёт осознание того, что все твои рассуждения и потуги смысла не имеют.

Лисп может конкурировать с С++? Нет. Может вообще хоть с чем-то конкурировать? Да - брайнфак. О чём ещё можно говорить? Ты сделай не просто поделку, а то, что будет конкурентоспособно крестовому софту.

AnonCxx
()
Ответ на: комментарий от anonymous

Меня не интересует поверья среди сектонтов и прочей малоразвитой фауны. Есть альтерантива - выкатывай. Нету - не кукарекай. Всё просто.

AnonCxx
()
Ответ на: комментарий от just-one-question

Уважаемый балабол. Я С++-хейтер, а не С++-кодер. Но это такое.

Далее, в чём чсв? Ты пытаешься слиться трактуя это как хочешь, взывая к шаблонной реакции публики. Но ты всегда проиграешь, т.к. достаточно задать пару наводящих вопрос «из чего это следует/что следует из этого» и ты тут же обделаешься, как и любой другой передёргиватель.

AnonCxx
()
Ответ на: комментарий от AnonCxx

Меня не интересует поверья среди сектонтов и прочей малоразвитой фауны.

Это любой лоровский школьник знает. Вали-ка ты на /dekstop куда-нибудь, не дорос еще.

Декораторы окон... Лол. Позорище лесное.

anonymous
()
Ответ на: комментарий от gag

Вот эти бы слова да тем, кому не хватает шаблонов в go. Достаточно кодогенератора.

Нет, не достаточно. То, что на шаблонах всякие «странные» задачи решают не значит, что они бесполезны.

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Задачи вполне себе нормальные. Но для их решения можно написать или программку-кодогенератор или программку (как в данном примере). В чём преимущество? Я могу их отлаживать, но я так до сих пор и не вижу поддержки отладки процесса компиляции шаблонов в gdb. Зачем примешивать выполнение (мета)программы в и без того сложный и запутанный процесс компиляции?

gag ★★★★★
()
Ответ на: комментарий от gag

но я так до сих пор и не вижу поддержки отладки процесса компиляции шаблонов в gdb.

Есть Metashell и Templight, например.

Зачем примешивать выполнение (мета)программы в и без того сложный и запутанный процесс компиляции?

Дык, я не агитирую, скорее наоборот. На шаблонах это делают скорее «потому что могут» или просто в порядке эксперимента/обучения.

Это не значит, что у шаблонов нет «нормального» применения.

DarkEld3r ★★★★★
()
Ответ на: комментарий от DarkEld3r

Есть Metashell и Templight, например.

На крайний случай хорошо, что есть.

Это не значит, что у шаблонов нет «нормального» применения.

Проблема в другом: шаблоны просто напрашиваются на то, чтобы нагородить код, который выглядит как-то неестественно, а в их отсутствие эта проблема бы и не возникла.

Если бы сказали, что препроцессора не хватает, надо ещё что-то, и реализовали бы это как дополнительный этап сборки, который поддаётся нормальной отладке, вот это было бы серьёзно.

gag ★★★★★
()
Ответ на: комментарий от DarkEld3r

Ага. Лишь бы над их решением можно было последовательно работать. Ведь процесс сборки имеет несколько стадий: пропроцессинг, компиляция, ассемблер, линковка. Например, для препроцессора есть ключ -E - можно увидеть результат выполнения этой стадии. А где стадия превращения промежуточного кода шаблона в код на C++, который непосредственно можно компилировать? Её нет. И вот из-за этого возникают те проблемы, о которых я говорю: которые можно было бы избежать, т.к. и других хватает.

gag ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.