Как Вы реализовали бы основное отражение в C++?

Я думаю о добавлении своего рода отражательных возможностей к некоторым классам C++ (так, чтобы я не должен был бы использовать RTTI): получая названия методов, объявленных полями, имя класса... этот вид материала.

Я думал о парсинге существующих исходных файлов, получите список заявленных полей и методы, и перепишите каждый исходный файл, добавив этот вид информации к каждому классу.

Что Вы думаете об этом подходе? Я хотел бы сделать все с нуля, так как я думаю, что это - прекрасная возможность учиться. Вы предложили бы другие способы сделать это?

//OFFTOPIC: это то, как спокойный делает это?

7
задан Geo 12 February 2010 в 15:15
поделиться

8 ответов

Это эквивалентно

for (var group in groupsCounty) {
  ...
}

С добавленной стоимостью доступа к индексу ( i ).

-121--3612640-

Python, 140 знаков

Мой первый код гольф, взвешивание на больших 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.

3
ответ дан 6 December 2019 в 19:36
поделиться

Проверьте библиотеку Boost.Mirror . Он еще не принят в Boost, поэтому вам придется загрузить его из Boost Vault.

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

РЕДАКТИРОВАТЬ: если вы действительно хотите проанализировать свой собственный код C ++, тогда, возможно, вам стоит рассмотреть clang

3
ответ дан 6 December 2019 в 19:36
поделиться

Подсчет удерживает и освобождает в этом случае. Это определенно утечка. Объект locationManager будет сохранен 2 раз: один раз вызовами alloc/init и один раз свойством. Установка для свойства значения nil приведет к освобождению locationManager только один раз.

Для примеров, приведенных в Edit 1, они действительно одинаковы. Похоже, у другого разработчика есть отвращение к немедленному авторелизингу или он не совсем понимает, что делает авторельез .

-121--4690673-

Его действия таковы: -

var groups = countrylist.split(',');    
for( var i = 0;  i < groups.length; i++ )
{
  var group = groups[i]
  ...
}

Единственное реальное отличие заключается в том, что вышесказанное гораздо более распространено и более легко распознается. Вы бы не опубликовали вышеуказанный код с вопросом «Что это делает?».

Код, который вы опубликовали, является примером умной разработки, но не обязательно хорошей практики кодирования.

-121--3612637-

Да, именно так это делает Qt - за исключением того, что он не добавляет информацию к самому классу, он создает новый класс, называемый метаклассом, который содержит статические данные о классе. Это лучше по понятным причинам.

Ни один чисто-C + + подход не обеспечит полностью автоматического отражения - язык этого не позволяет. Есть много попыток, включая Boost.Mirror и Boost.Reflection , но все они требуют шаблонных дополнений к вашему источнику.

2
ответ дан 6 December 2019 в 19:36
поделиться

Возможно, вы можете использовать библиотеку typeinfo, с ее помощью теперь вы можете класс объекта в время выполнения. Пример:

#include<iostream>

#include<typeinfo>
class A{};

int main()
{
A a;

std::cout<<typeid(a).name();

}

Вы можете увидеть больше в: http://www.cplusplus.com/reference/std/typeinfo/

[] `s

0
ответ дан 6 December 2019 в 19:36
поделиться

Если вы не хотите изменять компилятор C ++ или зависеть от расширений поставщика, вам понадобится куча макросов CPP, которые создают структуры данных.

1
ответ дан 6 December 2019 в 19:36
поделиться

Измените компилятор для создания статический метод GetClass, возвращающий указатель на объект Class, описывающий класс, для каждого определенного класса.

Измените компилятор / компоновщик, чтобы вытащить необходимые метаданные и вставить их в специальные разделы / символы результирующего исполняемого образа - так же, как добавляются символы отладки.

GetClass будет использовать (читать / загружать / кэшировать?) Вышеуказанные метаданные.

И да. Это много работы. (И приятным побочным эффектом является то, что вы почти наполовину избавляетесь от файлов заголовков - теперь эту информацию можно было извлечь прямо из изображения)

1
ответ дан 6 December 2019 в 19:36
поделиться

C ++ не поддерживает отражение. Усилия от boost и RTTI довольно ограничены и наполовину испорчены. Я бы не рекомендовал их.

Вы упомянули, что можете начать со скотча. Что ж, вы можете написать лексер C ++, используя lex / yacc или ANTLR . Довольно много работы, но вы многому научитесь.

Если написание синтаксического анализатора является для вас сложной задачей, есть еще несколько вариантов получения метаданных класса. У Microsoft есть DIA SDK, который предоставляет символьную информацию. Doxygen может генерировать XML-файлы, которые вы можете проанализировать, чтобы получить имена полей, имена методов класса. Мне удалось разобрать XML-файлы doxygen.

Если вы работаете только с платформой Microsoft, жизнеспособным решением является использование библиотеки типов (TLB). Это требует, чтобы вы преобразовали класс в интерфейс в MS IDL. MIDL компилирует IDL в .tlb, и ваше приложение может загружать файл .tlb во время выполнения. Ваше приложение может получить почти всю информацию о классе через интерфейс, свойства и методы ITypeInfo.

1
ответ дан 6 December 2019 в 19:36
поделиться

Возможно, вам стоит обратить внимание на gccxml. Он (например) преобразует this в this, что означает, что вам просто нужно разобрать XML вместо C++.

Есть интересная статья SP&E paper, в которой описывается использование gccxml в сочетании с модифицированным компоновщиком для "обеспечения Java-рефлексивной функциональности приложений C++ чистым и неинтрузивным способом".

1
ответ дан 6 December 2019 в 19:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: