2012-05-17 2 views
6

Я ничего не мог найти об этом в Интернете, поэтому я ищу кого-то с пониманием того, как C++/CX имплантирован. Wikipedia article на C++/CX говорит, что он поддерживает генерируемые генераторы во время выполнения, что подразумевает, что вам не нужен файл заголовка с полной реализацией, чтобы создать типичный тип. Я берусь за то, как это работает для .NET (в сборках содержится код IL, а JIT может просто вставлять в него конкретные типы и компилировать его всякий раз, когда есть новый экземпляр), но в C++/CX (который изначально компилируется) нет JIT для редактирования код в runtime (который я бы предпочел бы довольно сложно для машинного кода x86)Как работают дженерики в C++/CX

Итак, что это за трюк, это стирание стилей с боксом или какой-то новой надуманной схемой?

(я знаю, что метаданные о типах хранится в формате .NET, я после кода в методах)

+5

Понюхает, как «давайте бросить все в объект, а затем обратно» на дженерики. –

+0

будет общим. Стирание стилей типа C++ - это boost :: any, но вы не должны использовать генерические файлы runtime, если вам этого не нужно, и большинству людей никогда не придется. Вместо этого используйте шаблоны. –

+2

Я думаю, что это время для компиляции. Когда было встречено инициирование, например «MyTemplate obj;», компилятор будет генерировать копию определения конкретного класса с помощью «MyTemplate» и «RealType», а затем использует его для создания объекта. После компиляции нет шаблона. – Lyn

ответ

3

Глядя на эту статью здесь ссылки на дженерики в последней строке указывает, что генерики используется в C++/CX с интерфейсами и делегатами.

http://msdn.microsoft.com/en-us/library/windows/apps/br212455(v=vs.110).aspx

Это имеет смысл, потому что, так как он определен как интерфейс, который позволяет ++/CX компилятору C для компиляции встроенных функций коды для реальных объектов, а затем использовать общие интерфейсы способа, аналогичного шаблоны C++. Скомпилирован собственный код для функций, а общий интерфейс используется для работы с разными типами.

Для компилятора кажется, что это разница между C++/CLR и C++/CX. /clr: классы обобщений, интерфейсы & делегаты разрешены. /ZW: общие интерфейсы & только делегаты.

Если вы посмотрите здесь http://msdn.microsoft.com/en-us/library/windows/apps/hh699870(v=vs.110).aspx, вы заметите, что для классов нет общих правил.

Но если вы прочитали эту тему http://msdn.microsoft.com/en-us/library/windows/apps/hh755792(v=vs.110).aspx, вы заметите, что дженерики применяются как интерфейсы.

«Общий класс» в C++/CX достигается с помощью стандартных шаблонов C++. Конкретный экземпляр или компилятор, сгенерированный определенным типом родового, экспортируется в метаданные, но не сам шаблон. Таким образом, вы можете увидеть MyClass и MyClass из метаданных, но не оригинальный MyClass. Это не относится к случаю общего интерфейса, который экспортируется в метаданные как общий тип.

Более подробную информацию об этом можно найти здесь http://en.wikipedia.org/wiki/Windows_Runtime

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

Таким образом, короткий ответ заключается в том, что в C++/CX нет ничего подобного полным общим классам, как в C++/CLR. Используйте шаблоны для того же эффекта в приложениях C++/CX. Если у вас должны быть общие файлы C++, используйте dll, созданный с помощью C++/CLI, и выполните этот код из программы, скомпилированной как C++/CX.

Примечание! Я почерпнул это из рассмотрения различных статей, а некоторые из них в msdn, похоже, говорят, что они могут быть изменены.

Теперь использовать общие интерфейсы в C++/CX с шаблонами, вероятно, то, что они намереваются. Таким образом, вы создаете шаблон MyClass, а затем реализуете свой общий интерфейс MyInterface, поэтому, если вы создали экземпляр MyClass, новый тип будет автоматически реализовывать MyInterface, и тогда этот интерфейс можно будет использовать где угодно. Поэтому вне компилируемой dll и файлов заголовков другие C++/CX-модули и файлы могут работать с типами, такими как MyInterface, без использования файла заголовка, потому что экземпляр шаблона находился внутри скомпилированной dll, но C++-файл, использующий метаданные, знает, как введите тип MyInterface, потому что он содержит метаданные для MyInterface, но не метаданные для MyClass.

В очень короткие сроки отсутствуют общие классы, а общий интерфейс и поддержка делегатов в C++/CX - это все, что на самом деле работает как generics в C++/CLI.

+2

Помните, что C++/CX не совпадает с C++/CLI - время выполнения Windows не совпадает с CLR, и в CLR есть функциональность, которая не поддерживается winrt. Вы не можете предположить, что функциональность CLR будет работать в приложении WinRT C++/CX –

3

Насколько я знаю, произвольные C++/CX Generics не поддерживаются. C++/CX может использовать интерфейсы, зависящие от Winrt, которые отображаются как специализированные шаблоны C++, но произвольные дженерики не могут быть экспортированы.

Вы можете создавать специализации параметризованных интерфейсов из пространства имен Windows :: Foundation, но не изначально параметризованных интерфейсов (public ref templates).

+0

Да, второй абзац прав. –

Смежные вопросы