包含模板方法的 IDL 文件
IDL file containing template methods
是否可以像这样在 IDL 文件中包含参数化方法:
runtimeclass A
{
A();
T f<T>();
};
有哪些替代方案?
Windows 运行时类型系统仅支持一组固定的泛型类型,即 Windows.Foundation
命名空间中的类型(例如 IAsyncOperation<T>
和 EventHandler<T>
)和Windows.Foundation.Collections
命名空间中的那些(例如 IVector<T>
)。在定义您自己的类型时,即使是这些泛型类型也必须专门化为具体类型(例如 IVector<HSTRING>
)。
最接近您指定的是使用IInspectable
作为您的参数类型/return类型。这可以包含任何对象类型或任何标量值(通过 IReference<T>
),但是编译器没有强制执行类型安全,也无法从参数等中推断出 return 类型
如果您提前知道您的客户将使用哪些具体类型(例如 HSTRING
和 Int32
),那么您可以直接在 ABI 级别将它们编码为 HSTRING FooString(HSTRING arg)
和 Int32 FooInt32(Int32 arg)
然后您的实现可以使用标准的模板化 C++ 函数。
是否可以像这样在 IDL 文件中包含参数化方法:
runtimeclass A
{
A();
T f<T>();
};
有哪些替代方案?
Windows 运行时类型系统仅支持一组固定的泛型类型,即 Windows.Foundation
命名空间中的类型(例如 IAsyncOperation<T>
和 EventHandler<T>
)和Windows.Foundation.Collections
命名空间中的那些(例如 IVector<T>
)。在定义您自己的类型时,即使是这些泛型类型也必须专门化为具体类型(例如 IVector<HSTRING>
)。
最接近您指定的是使用IInspectable
作为您的参数类型/return类型。这可以包含任何对象类型或任何标量值(通过 IReference<T>
),但是编译器没有强制执行类型安全,也无法从参数等中推断出 return 类型
如果您提前知道您的客户将使用哪些具体类型(例如 HSTRING
和 Int32
),那么您可以直接在 ABI 级别将它们编码为 HSTRING FooString(HSTRING arg)
和 Int32 FooInt32(Int32 arg)
然后您的实现可以使用标准的模板化 C++ 函数。