我有一个预先存在的本机 C++ 库,我试图通过 C++/WinRT 运行时组件投影 API 来向 UWP 应用程序公开。我很难理解如何公开模板化函数。
对于以下示例 C++ 类:
struct ExampleClass
{
ExampleClass() = default;
template <typename T>
std::vector<T> create_a_vector();
};
这个例子显然很愚蠢;实际上,模板化工厂正在创建另一个特定于库的类型(不是std::vector
),并且它是 ExampleClass 的成员是有原因的。
我希望create_a_vector
通过在我的 IDL 和运行时组件中专门声明和实现它们来公开专业化的子集。例如,以下 IDL 将是理想的:
namespace ExampleClassWinRT
{
[default_interface]
runtimeclass ExampleClass
{
ExampleClass();
IVector<String> CreateAVector<String>();
IVector<Int32> CreateAVector<Int32>();
IVector<UInt8> CreateAVector<UInt8>();
IVector<ExampleClassWinRT.SomeOtherType> CreateAVector<ExampleClassWinRT.SomeOtherType>();
// .. and so on
}
}
然后在每个版本的实现(在 C++/WinRT 中)中,CreateAVector
我会根据需要在 WinRT 和 C++ 类型之间进行转换,并调用create_a_vector
.
然后,使用 C# 代码可能看起来像这样:
using ExampleClassWinRT;
namespace ExampleApp
{
public sealed partial class MainPage : Page
{
public MyFunc()
{
var c = ExampleClassWinRT.ExampleClass();
var v1 = c.CreateAVector<String>();
var v2 = c.CreateAVector<Int32>();
var v3 = c.CreateAVector<ExampleClassWinRT.SomeOtherType>();
}
}
}
目标 C# 示例代码中使用的语法似乎是合法的,实际上许多 WinRT API 都是模板化的(IVector<T>
例如)。但是,我上面的 MIDL 语法无效,并且我没有找到任何关于如何通过 MIDL 和/或 WinRT/C++ 创建模板化 WinRT API 表面的文档。
这种将原生 C++ 库投影到 WinRT 中的方法是否可行?我是在叫错树了吗?