使用CLI包装器中的C ++函数模板

时间:2018-11-21 15:33:21

标签: c# c++ templates command-line-interface

我正在构建一个C ++ / CLI DLL,以便能够与C#应用程序通信纯C ++ DLL。普通的C ++ DLL是第三方提供的,我无法对其进行修改。

该纯C ++ DLL通过以下方式包含一些成员函数模板:

  1. 纯C ++ DLL头文件:

    class pureCPP
    {
        template<typename T>
        void usefulFunctionA(T &b, T const &a)
        {
            /* Implementation of the function */
        }
    }
    

所以我的想法是将其反映在CLI DLL头文件中:

  1. CLI DLL头文件:

    public ref class CLI_DLL
    {
        template<typename T>
        void usefulFunctionB(T &b, T const &a)
        {
            pureCppPtr->usefulFunctionA(b, a);
        }
    
        PureCPP *pureCppPtr;
    }
    

然后在C#可执行文件中,只需调用:

CLI_DLL cliDLL = new CLI_DLL;
double a, b;
cliDLL.usefulFunctionB<double>(a, b);

这可行吗?还是我只是被迫简单地为每种可能的函数模板类型实例化重载?

我已经阅读了C#中的一种叫做泛型的东西,我可以使用该技术来实现类似的东西吗?到目前为止,我发现的每篇文章都涉及类模板(而不仅仅是它们中的方法),或者建议在CLI中对所需类型进行显式实例化,如果可能的话,我想避免这种情况(假设每个函数可以被1000种不同的类型使用...我想复制1000种不同的实例并不是那么好。

我是C#的新手,但是AFAIU不会将参数(在这种情况下为类型)从泛型函数传递到模板之所以可行,是因为前者是在运行时解决的,而后者是在编译时完成的,在这种情况下,我将不得不将以前的实现更改为以下形式:

  • CLI DLL头文件:

    public ref class CLI_DLL
    {
        /* Only define the template here */
        template<typename T>
        void usefulFunctionB(T &b, T const &a);
    
        PureCPP *pureCppPtr;
    }
    
  • CLI DLL源文件:

    /* Explicitly instantiate the template in the source file */
    template<>CLI_DLL::usefulFunctionB<double>(double &A, double const &B)
    {
        pureCppPtr->usefulFunctionA<double>(b, a);
    }
    

依此类推,针对我需要的每种类型。不过,另一种方法(通用模板)似乎可行,对吧?

(顺便说一句,还有一个附带的问题,在这种情况下,是否真的需要显式地称为“ double”类型?我从来没有真正理解为什么在某些情况下Visual Studio无法自动推断类型模板,例如CLang或GCC)。

这是我真正想要避免的事情,相反,我希望能够执行类似我公开的第一个代码这样的事情。

非常感谢。

0 个答案:

没有答案