1

我有一个预先存在的本机 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 中的方法是否可行?我是在叫错树了吗?

4

0 回答 0