Я думаю о добавлении своего рода отражательных возможностей к некоторым классам C++ (так, чтобы я не должен был бы использовать RTTI): получая названия методов, объявленных полями, имя класса... этот вид материала.
Я думал о парсинге существующих исходных файлов, получите список заявленных полей и методы, и перепишите каждый исходный файл, добавив этот вид информации к каждому классу.
Что Вы думаете об этом подходе? Я хотел бы сделать все с нуля, так как я думаю, что это - прекрасная возможность учиться. Вы предложили бы другие способы сделать это?
//OFFTOPIC: это то, как спокойный делает это?
Это эквивалентно
for (var group in groupsCounty) {
...
}
С добавленной стоимостью доступа к индексу ( i
).
Мой первый код гольф, взвешивание на больших 140 знаков (import statement, I deny you!):
import operator as o
def c(t):return({1:1,8:2}.get(reduce(o.mul,t[:3]),0))
def g(t):return max([c(t[x::y]) for x,y in zip((0,0,0,1,2,2,3,6),(1,3,4,3,3,2,1,1))])
Немного менее непонятный g:
def g(t):return max([c(t[x::y]) for x,y in [[0,1],[0,3],[0,4],[1,3],[2,3],[2,2],[3,1],[6,1]]])
-121--1152322- Я бы подделал gcc.
Проверьте библиотеку Boost.Mirror . Он еще не принят в Boost, поэтому вам придется загрузить его из Boost Vault.
Библиотека все еще находится в разработке, а документации мало, но, изучив предоставленные примеры , вы, возможно, сможете добиться того, чего хотите.
РЕДАКТИРОВАТЬ: если вы действительно хотите проанализировать свой собственный код C ++, тогда, возможно, вам стоит рассмотреть clang
Подсчет удерживает и освобождает в этом случае. Это определенно утечка. Объект locationManager
будет сохранен 2 раз: один раз вызовами alloc/init
и один раз свойством. Установка для свойства значения nil
приведет к освобождению locationManager
только один раз.
Для примеров, приведенных в Edit 1, они действительно одинаковы. Похоже, у другого разработчика есть отвращение к немедленному авторелизингу или он не совсем понимает, что делает авторельез
.
Его действия таковы: -
var groups = countrylist.split(',');
for( var i = 0; i < groups.length; i++ )
{
var group = groups[i]
...
}
Единственное реальное отличие заключается в том, что вышесказанное гораздо более распространено и более легко распознается. Вы бы не опубликовали вышеуказанный код с вопросом «Что это делает?».
Код, который вы опубликовали, является примером умной разработки, но не обязательно хорошей практики кодирования.
-121--3612637-Да, именно так это делает Qt - за исключением того, что он не добавляет информацию к самому классу, он создает новый класс, называемый метаклассом, который содержит статические данные о классе. Это лучше по понятным причинам.
Ни один чисто-C + + подход не обеспечит полностью автоматического отражения - язык этого не позволяет. Есть много попыток, включая Boost.Mirror и Boost.Reflection , но все они требуют шаблонных дополнений к вашему источнику.
Возможно, вы можете использовать библиотеку typeinfo, с ее помощью теперь вы можете класс объекта в время выполнения. Пример:
#include<iostream>
#include<typeinfo>
class A{};
int main()
{
A a;
std::cout<<typeid(a).name();
}
Вы можете увидеть больше в: http://www.cplusplus.com/reference/std/typeinfo/
[] `s
Если вы не хотите изменять компилятор C ++ или зависеть от расширений поставщика, вам понадобится куча макросов CPP, которые создают структуры данных.
Измените компилятор для создания статический метод GetClass, возвращающий указатель на объект Class, описывающий класс, для каждого определенного класса.
Измените компилятор / компоновщик, чтобы вытащить необходимые метаданные и вставить их в специальные разделы / символы результирующего исполняемого образа - так же, как добавляются символы отладки.
GetClass будет использовать (читать / загружать / кэшировать?) Вышеуказанные метаданные.
И да. Это много работы. (И приятным побочным эффектом является то, что вы почти наполовину избавляетесь от файлов заголовков - теперь эту информацию можно было извлечь прямо из изображения)
C ++ не поддерживает отражение. Усилия от boost и RTTI довольно ограничены и наполовину испорчены. Я бы не рекомендовал их.
Вы упомянули, что можете начать со скотча. Что ж, вы можете написать лексер C ++, используя lex / yacc или ANTLR . Довольно много работы, но вы многому научитесь.
Если написание синтаксического анализатора является для вас сложной задачей, есть еще несколько вариантов получения метаданных класса. У Microsoft есть DIA SDK, который предоставляет символьную информацию. Doxygen может генерировать XML-файлы, которые вы можете проанализировать, чтобы получить имена полей, имена методов класса. Мне удалось разобрать XML-файлы doxygen.
Если вы работаете только с платформой Microsoft, жизнеспособным решением является использование библиотеки типов (TLB). Это требует, чтобы вы преобразовали класс в интерфейс в MS IDL. MIDL компилирует IDL в .tlb, и ваше приложение может загружать файл .tlb во время выполнения. Ваше приложение может получить почти всю информацию о классе через интерфейс, свойства и методы ITypeInfo.
Возможно, вам стоит обратить внимание на gccxml. Он (например) преобразует this в this, что означает, что вам просто нужно разобрать XML вместо C++.
Есть интересная статья SP&E paper, в которой описывается использование gccxml в сочетании с модифицированным компоновщиком для "обеспечения Java-рефлексивной функциональности приложений C++ чистым и неинтрузивным способом".