如何在WinRT中调用类似STL的Vector和Map
1个回答
推荐于2016-03-10 · 知道合伙人数码行家
huanglenzhi
知道合伙人数码行家
向TA提问 私信TA
知道合伙人数码行家
采纳数:117538
获赞数:517180
长期从事计算机组装,维护,网络组建及管理。对计算机硬件、操作系统安装、典型网络设备具有详细认知。
向TA提问 私信TA
关注
展开全部
通常情况下,在对C++组件进行编码时,可使用常规 C++ 库和内置类型,但抽象二进制接口 (ABI) 边界处的 C++ 库和内置类型除外,该处需与 JavaScript 进行双向数据传递。
只有 Windows 运行时类型可以跨 ABI 边界传递。
分析:所以你在WinRT 组件里面编写的程序,需要使用Windows运行时类型,就是带有尖冒号“^”,而不是传统的C++值类型程序。
虽然你也可以使用C++内置类型(如int,double),但是编译器会在公共方法的参数和返回类型中自动将其转换为相应的 Windows 运行时类型,如 int32、flot64 等。除非跨 ABI 传递类型,否则不会进行此类转换。
1. C++内置类型、库类型、和Windows运行时类型的区别?
答:
C++内置类型:就是我们经常使用的int,double,float,bool等和C++语言相关的类型。
库类型:
Windows运行时类型:声明为public ref class 类名 sealed。“^”这个尖冒号的类型,称为可激活类(又称为ref类)是可通过其他语言(如JavaScript)进行实例化的类,这个尖冒号告诉编译器将该类创建为与Windows运行时兼容的类型,sealed关键字指定该类不可继承。
2. 如何使用类似STL的类型系统呢?
你需要明白2点:第一点是具体类型集合,第二点是类型实现的公共接口。
具体集合类型(如 Platform::Collections::Map 类 和 Platform::Collections::Vector 类)在Platform::Collections 命名空间 中定义。
类型实现的公共接口在 Windows::Foundation::Collections 命名空间 (C++/CX) 中定义。
这里重点说的是如何使用WinRT中IVector类型。
在WinRT里面的Class1.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个在不同的命名空间定义的。
一个是接口,另一个是实现。
同理,你也该明白IVector和Vector等接口和实现的类了。
只有 Windows 运行时类型可以跨 ABI 边界传递。
分析:所以你在WinRT 组件里面编写的程序,需要使用Windows运行时类型,就是带有尖冒号“^”,而不是传统的C++值类型程序。
虽然你也可以使用C++内置类型(如int,double),但是编译器会在公共方法的参数和返回类型中自动将其转换为相应的 Windows 运行时类型,如 int32、flot64 等。除非跨 ABI 传递类型,否则不会进行此类转换。
1. C++内置类型、库类型、和Windows运行时类型的区别?
答:
C++内置类型:就是我们经常使用的int,double,float,bool等和C++语言相关的类型。
库类型:
Windows运行时类型:声明为public ref class 类名 sealed。“^”这个尖冒号的类型,称为可激活类(又称为ref类)是可通过其他语言(如JavaScript)进行实例化的类,这个尖冒号告诉编译器将该类创建为与Windows运行时兼容的类型,sealed关键字指定该类不可继承。
2. 如何使用类似STL的类型系统呢?
你需要明白2点:第一点是具体类型集合,第二点是类型实现的公共接口。
具体集合类型(如 Platform::Collections::Map 类 和 Platform::Collections::Vector 类)在Platform::Collections 命名空间 中定义。
类型实现的公共接口在 Windows::Foundation::Collections 命名空间 (C++/CX) 中定义。
这里重点说的是如何使用WinRT中IVector类型。
在WinRT里面的Class1.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个在不同的命名空间定义的。
一个是接口,另一个是实现。
同理,你也该明白IVector和Vector等接口和实现的类了。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询