Reflexion Perfect Forwarding и шаблон посетителя - PullRequest
0 голосов
/ 29 ноября 2010

http://codepad.org/etWqYnn3

Я работаю над некоторой формой системы рефлексии для C ++, несмотря на многих, кто предупреждал.То, на что я обращаю внимание, это набор интерфейсов IScope, IType, IMember, IMonikerClient и класс-обертка, который содержит вышеупомянутое, скажем, CReflexion.Игнорирование всего, кроме члена, который является важной частью, вот что я хотел бы сделать:

1) Экземпляр оболочки

2) Определить, какой тип должен использоваться

3) Тип экземпляра

4) Перегрузка () и [] для доступа к содержащемуся члену из внешнего (обертки) в коде так же легко, как это делается при использовании std :: vector

Я считаю, что с помощью 0x я могу переадресовать вызов метода любого типа для параметра.Однако я не могу динамически разыгрывать, потому что приведение не принимает переменную (если есть способы, о которых я не знаю!)

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

Может кто-то предложить мне что-нибудь здесь?Это кроме того, чтобы придерживаться VARIANT: /

Спасибо!

1 Ответ

1 голос
/ 29 ноября 2010

C ++, даже в «0x land», просто не предоставляет информацию, необходимую для создания чего-то вроде отражения.

Я считаю, что с помощью 0x я могу переадресовать вызов метода любого типа для параметра.

Вы не можете переслать тип в качестве параметра. Вы можете переслать const-volatile квалификаторы для члена, но все это делается в шаблонах во время компиляции. Когда вы используете такие вещи, как forward, проверка во время выполнения не выполняется.

Ваш шаблон там для operator () не будет компилироваться, если только T не преобразуется в int*, string* и A** одновременно. Думайте о шаблонах как о простом алгоритме поиска и замены, который генерирует для вас несколько функций - значение T заменяется на имя типа при создании экземпляра шаблона, и функция компилируется как обычно.

Наконец, вы можете использовать dyanmic_cast только для понижения иерархии классов - приведение между совершенно не связанными типами A B и C не будет работать правильно.

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

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