簡単に言うと、C++/CX とC++/WinRTは同じプロジェクト内で使用できます。
C++/CX コンパイラは、Winmd 型をルート名前空間に挿入します。C++/WinRT は、独自のルート winrt 名前空間内にすべてをラップして、C++/CX との相互運用性に対応し、他のライブラリとの C++ コンパイラのあいまいなエラーを回避します。したがって、次の C++/CX コード:
using namespace Windows::Foundation;
using namespace Windows::Networking;
Uri ^ uri = ref new Uri(L"https://moderncpp.com/");
HostName ^ name = ref new HostName(L"moderncpp.com");
次のように C++/WinRT で書き直すことができます。
using namespace winrt;
using namespace Windows::Foundation;
using namespace Windows::Networking;
Uri uri(L"https://moderncpp.com/");
HostName name(L"moderncpp.com");
または、/ZW を使用してコンパイルしている場合は、次のように書き換えることができます (エラー C2872: 'Windows': ambiguous symbol を回避するため):
using namespace winrt::Windows::Foundation;
using namespace winrt::Windows::Networking;
Uri uri(L"https://moderncpp.com/");
HostName name(L"moderncpp.com");
同じソース ファイルで C++/CX と C++/WinRT の両方を組み合わせるもう 1 つの方法は、次のように両方にルート名前空間を使用することです。
namespace cx
{
using namespace Windows::Foundation;
using namespace Windows::Networking;
}
namespace winrt
{
using namespace Windows::Foundation;
using namespace Windows::Networking;
}
void Sample()
{
cx::Uri uri(L"https://moderncpp.com/");
winrt::HostName name(L"moderncpp.com");
}
結局のところ、C++/WinRT は、該当する C++ プロジェクトに含めることができる単なる標準 C++ ライブラリです。ただし、C++/CX と C++/WinRT では、メタデータの扱いが大きく異なります。C++/CX はメタデータを直接使用および生成しますが、C++/WinRT は標準 C++ によって制約されているため、そのギャップを埋めるためにスタンドアロン ツール (cppwinrt.exe) が必要です。