Ограничения C ++ / CX - PullRequest
       52

Ограничения C ++ / CX

2 голосов
/ 05 декабря 2011

Я хочу написать библиотеку с использованием синтаксиса C ++ / CX и использовать ее в других проектах.

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

Также мы не можем написать такой код:

private:
    int _D;
public:
    property int& D { int& get() {return _D;}}

или передайте это свойство таким методам:

void SampleMethod(int& d);

Я не знаю, почему библиотека времени выполнения Windows имеет такие ограничения.

Как я могу скомпилировать расширения C ++ / CX и Windows Runtime в файле .lib? Или как мне предварительно скомпилировать файлы кода всего проекта WRL в другом проекте?

Ответы [ 2 ]

4 голосов
/ 05 декабря 2011

WinRT - это ABI, предназначенный для использования на разных языках - по крайней мере, C ++, C #, VB и JS.По этой причине предоставляемые им конструкции ограничены тем, что может быть представлено на этих языках простым способом - например, если вы вернетесь по ссылке, как код C # будет использовать это?

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

3 голосов
/ 06 декабря 2011

В отличие от C ++, где «struct» - это, по сути, «класс, в котором все члены являются открытыми», в среде выполнения Windows «struct» - это тип значения.Таким образом, он не может иметь никаких методов, включая методы доступа к свойствам (типы значений не могут иметь методы).

Кроме того, поскольку структуры являются типами значений, они всегда передаются по значению.Это означает, что передача структуры в метод требует копирования содержимого структуры (тип значения подразумевает, что каждый потребитель работает со своей собственной копией типа данных).Как следствие этого, структуры должны быть довольно маленькими по размеру (подумайте «до 16 байт»).

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

...