На самом деле есть много способов. Один из них не так давно рассматривался на Хабре.
Но самое удивительное — есть способы организации полной рефлексии не только на современном С++, но и на чистом Си, причем времен создания языка (70-х годов!).
Есть способ на boost::preprocessor, который в общем не зависит от того, Си это или С++. Достаточно навороченный способ, требующий большой отдельной статьи.
А есть еще один способ, невероятно простой и прозрачный — основанный на двойном include заголовочого файла; элементы синтаксической конструкции (не только перечисления, но и например структуры) объявляются с помощью специальных макросов, которые в зависимости от некоторой макропеременной раскрываются или в обычные элементы (имя перечисления, идентификаторы элементов и т.д.), или в элементы статического массива данных рефлекси.
Ну а дальше очевидно: везде используется обычное подключение заголовочного файла с перечислением, и только в одном единственном месте (точке инстанцирования, которая должна быть .c или .cpp файлом) предварительно объявляется макрос и создается статический объект рефлексии
Прикольная картинка) Смех смехом, но я бы предпочел устройство в таком стиле современным однотипным стекляшкам. Обилие периферии и аппаратных возможностей греет мою хакерскую душу))
Отлично! Нестандартная периферия понемногу добавляется в смартфоны, правда пока в единичных случаях и массового распространения это не получило
Вот если бы когда какой-нибудь производитель объединил всю нестандартную периферию в одном устройстве...
О, Матрица — мой любимый фильм. Спасибо вам, прямо погрузился в старые добрые времена… В свое время сколько было интереснейших дискуссий ...
По поводу того, зачем машинам люди и как им удалось обойти закон сохранения энергии, есть теория что мозги подключенных людей таки использовались машинами для каких-то вычислительных задач. Не знаю, есть ли на это прямые указания в фильме, но мысль вполне логичная.
И напоследок, интересный (как минимум) факт: переверните картинку и немного увеличьте:
Срок действия паспорта Нео истекает 11 сентября 2001 года
Напомню, фильм вышел в 1999 году.
К сожалению, система хорошо заморачивает мозги людям. Не далее как вчера по зомбоящику рассказывали, что для построения карьеры там нужно состоять в какой-то "религиозно-патриотической" организации. Так что система самоподдерживающаяся.
Мне гораздо интереснее, можно ли такую систему взломать и как именно… Чтобы с одной стороны — разрушительных последствий для людей, но с другой — чтобы религиозная диктатура (да и религиозность вообще) таки исчезла...
А вот как может виртуальное рабочее место стоить дешевле чем содержание ПК, если для работы на виртуальном рабочем месте все равно нужен физический ПК (который тоже нужно содержать)?
Думаю лучше будет если я попробую подробнее разъяснить свою точку зрения в следующей части.
Здесь да, признаюсь это моя ошибка — я сделал утверждение, которое является скорее моей оригинальной идеей, а не чем-то общепринятым, да еще и не объяснил что это за идея и почему я так считаю. Обязательно это учту.
Я вас тоже понял. Конечно, кортеж это тип с определенной точки зрения. И для конечного программиста удобнее рассматривать кортеж именно как тип, обладающий какими-то особенностями — по сравнению например со структурами, которые обладают другими особенностями.
Но я выбрал несколько другую точку зрения, более близкую к внутреннему устройству компилятора, и с этой точки зрения кортеж — скорее "полуфабрикат", заготовка для "полноценного" типа.
Так например, список аргументов функции — это тип? Обычно нет (сама сигнатура функции — тип, но не отдельно список аргументов). Но при этом вполне можно сказать что список аргументов функции — это кортеж. Ну или рассматривать список аргументов функции как самостоятельный тип, что в общем одно и то же.
Из курсива надо бы убрать все «рукописные» буквы, которые слишком сильно отличаются от привычных печатных, и заменить на что-то более адекватное.
На самом деле этих «рукописных» не так уж и много, r, s, f, l (которая безусловно не должна быть просто «палочкой», но у них она слишком похожа на 'e').
Тогда может и ничего будет.
А кстати, что такое «10»? Какого типа? byte, short, word, int, uint, long, float, double?
Иногда у чисел бывают модификаторы, например можно представить что «10i32» — это int32. А без модификаторов? Брать «тип по умолчанию» («int»), как в Си? А правильно ли это?
В действительности правильный подход к литеральным константам такой — они сами по себе на этапе построения синтаксического дерева не полностью типизированы. Типизация происходит позднее, когда выясняется, в каком выражении с какими типами операндов эта константа используется.
Хотя эти вопросы больше касаются дизайна компиляторов, но это не делает их мене интересными. И это открывает дополнительные возможности — такие как архитектурно правильная интеграция в язык программирования «длинной арифметики».
Пример вполне реальный. В структурах именованные поля, и дальше показано что даже если две структуры «структурно идентичны», они все равно несовместимы — то есть объект типа Foo нельзя присвоить объекту типа Bar, и наоборот. То есть первую часть (до кортежей) вы можете проверить практически на любом языке программирования.
Дальше показано, что поведение кортежей отличается от поведения структур — если два кортежа структурно идентичны, то их можно свободно присваивать между собой, и даже между объектами кортежа и структуры. Ближайший аналог подобного синтаксиса — Swift, возможно что-то сделают в C++17.
Еще структуры как правило номинативно типизированы; то есть объявленная структура создает тип, по умолчанию несовместимый с другими типами, даже если структурно эти типы идентичны. habrahabr.ru/post/276871/#comment_8769577
Можно сказать, что кортежи это «почти что структуры» (struct).
Чем отличаются списки от структур, я надеюсь что понятно:)
Более интересный вопрос — чем отличаются кортежи от структур, там отличия более тонкие (хотя статья не посвящена именно этим отличиям).
Но самое удивительное — есть способы организации полной рефлексии не только на современном С++, но и на чистом Си, причем времен создания языка (70-х годов!).
Есть способ на boost::preprocessor, который в общем не зависит от того, Си это или С++. Достаточно навороченный способ, требующий большой отдельной статьи.
А есть еще один способ, невероятно простой и прозрачный — основанный на двойном include заголовочого файла; элементы синтаксической конструкции (не только перечисления, но и например структуры) объявляются с помощью специальных макросов, которые в зависимости от некоторой макропеременной раскрываются или в обычные элементы (имя перечисления, идентификаторы элементов и т.д.), или в элементы статического массива данных рефлекси.
Ну а дальше очевидно: везде используется обычное подключение заголовочного файла с перечислением, и только в одном единственном месте (точке инстанцирования, которая должна быть .c или .cpp файлом) предварительно объявляется макрос и создается статический объект рефлексии
Вот если бы когда какой-нибудь производитель объединил всю нестандартную периферию в одном устройстве...
А может быть вы еще что-то подобное знаете?
По поводу того, зачем машинам люди и как им удалось обойти закон сохранения энергии, есть теория что мозги подключенных людей таки использовались машинами для каких-то вычислительных задач. Не знаю, есть ли на это прямые указания в фильме, но мысль вполне логичная.
И напоследок, интересный (как минимум) факт: переверните картинку и немного увеличьте:
Срок действия паспорта Нео истекает 11 сентября 2001 года
Напомню, фильм вышел в 1999 году.
vesti7.ru/news?id=49039
организация называется "Басидж"
Мне гораздо интереснее, можно ли такую систему взломать и как именно… Чтобы с одной стороны — разрушительных последствий для людей, но с другой — чтобы религиозная диктатура (да и религиозность вообще) таки исчезла...
Здесь да, признаюсь это моя ошибка — я сделал утверждение, которое является скорее моей оригинальной идеей, а не чем-то общепринятым, да еще и не объяснил что это за идея и почему я так считаю. Обязательно это учту.
И красиво, и эффектно, и пользу приносит
Но я выбрал несколько другую точку зрения, более близкую к внутреннему устройству компилятора, и с этой точки зрения кортеж — скорее "полуфабрикат", заготовка для "полноценного" типа.
Так например, список аргументов функции — это тип? Обычно нет (сама сигнатура функции — тип, но не отдельно список аргументов). Но при этом вполне можно сказать что список аргументов функции — это кортеж. Ну или рассматривать список аргументов функции как самостоятельный тип, что в общем одно и то же.
На самом деле этих «рукописных» не так уж и много, r, s, f, l (которая безусловно не должна быть просто «палочкой», но у них она слишком похожа на 'e').
Тогда может и ничего будет.
Иногда у чисел бывают модификаторы, например можно представить что «10i32» — это int32. А без модификаторов? Брать «тип по умолчанию» («int»), как в Си? А правильно ли это?
В действительности правильный подход к литеральным константам такой — они сами по себе на этапе построения синтаксического дерева не полностью типизированы. Типизация происходит позднее, когда выясняется, в каком выражении с какими типами операндов эта константа используется.
Хотя эти вопросы больше касаются дизайна компиляторов, но это не делает их мене интересными. И это открывает дополнительные возможности — такие как архитектурно правильная интеграция в язык программирования «длинной арифметики».
Дальше показано, что поведение кортежей отличается от поведения структур — если два кортежа структурно идентичны, то их можно свободно присваивать между собой, и даже между объектами кортежа и структуры. Ближайший аналог подобного синтаксиса — Swift, возможно что-то сделают в C++17.
habrahabr.ru/post/276871/#comment_8769577
Чем отличаются списки от структур, я надеюсь что понятно:)
Более интересный вопрос — чем отличаются кортежи от структур, там отличия более тонкие (хотя статья не посвящена именно этим отличиям).