WinRTでSTLのようなVectorとMapを呼び出す方法


参考資料:1.http://msdn.microsoft.com/zh-cn/library/windows/apps/hh710418.aspx 2. http://msdn.microsoft.com/zh-cn/library/windows/apps/hh441569.aspx
通常、C++コンポーネントを符号化する場合、通常のC++ライブラリと組み込みタイプを使用できますが、抽象バイナリインタフェース(ABI)エッジ
境界のC++ライブラリと内蔵タイプを除いて、JavaScriptと双方向のデータ転送が必要です.
ABI境界にまたがって転送できるのは、Windowsランタイムタイプのみです.解析:WinRTコンポーネントで作成したプログラムは、Windowsランタイムタイプを使用する必要があります.
従来のC++値タイププログラムではありません.
C++組み込みタイプ(int,doubleなど)も使用できますが、コンパイラは共通メソッドのパラメータと戻りタイプで自動的に
int 32、flot 64など、対応するWindowsランタイムタイプに変換します.ABIにまたがってタイプを渡さない限り、入力しません.
行はこのように変換されます.
1.C++内蔵タイプ、ライブラリタイプ、Windowsランタイムタイプの違い答え:C++内蔵タイプ:私たちがよく使うint,double,float,boolなど、C++言語に関連するタイプです.ライブラリタイプ:Windowsランタイムタイプ:public ref classクラス名sealedと宣言します.「^」という尖ったコロンのタイプは、アクティブクラスと呼ばれています
(refクラスとも呼ばれる)は、JavaScriptなどの他の言語でインスタンス化できるクラスであり、コンパイラにクラスを教える尖ったコロンである.
Windowsの実行時と互換性のあるタイプとして作成し、sealedキーワードはクラスを継承できないことを指定します.
 
2.STLのようなタイプのシステムをどのように使うか.2点を理解する必要があります.1つ目は具体的なタイプの集合で、2つ目はタイプ実装の共通インタフェースです.具体的な集合タイプ(Platform::Collections::MapクラスとPlatform::Collections::Vectorクラスなど)は
Platform::Collectionsネーミングスペースで定義します.
タイプ実装の共通インタフェースは、Windows::Foundation::Collectionsネーミングスペース(C+/CX)で定義されます.
ここではWinRTでのIVectorタイプの使い方に重点を置きます.WinRTの中にあるClass 1.hに加えて
#include <map>
using namespace Platform;
namespace WFC = Windows::Foundation::Collections;
namespace WFM = Windows::Foundation::Metadata;


[WFM::WebHostHidden]
public ref class Person sealed
{
public:
 Person(String^ name);
 void AddPhoneNumber(String^ type, String^ number);
 property WFC::IMapView<String^, String^>^ PhoneNumbers
 {
  WFC::IMapView<String^, String^>^ get();
 }

private:
 String^ m_name;
 std::map<String^, String^> m_numbers;
};

Person::Person(String^ name): m_name(name)
{
}

void Person::AddPhoneNumber(String^ type, String^ number)
{
 m_numbers[type] = number;
}

IMapView< String^, String^>^ Person::PhoneNumbers::get()
{
 // Simple implementation. 
 return ref new MapView< String^, String^>(m_numbers);
}

 
次はあなたのBlank App(XAML)のMainPageです.xaml.cppのコンストラクション関数では、次のようにクラスを呼び出すことができます.
Person^ p = ref new Person("Clark Kent");
p->AddPhoneNumber("Home", "425-555-4567");
p->AddPhoneNumber("Work", "206-555-9999");
String^ workphone = p->PhoneNumbers->Lookup("Work");

 
IMapViewとMapViewの2つが異なるネーミングスペースで定義されていることに注意してください.1つはインタフェースであり,もう1つは実装である.
同じように、IVectorやVectorなどのインタフェースや実装のクラスも理解しなければなりません.