我正在构建一个C ++ / CLI DLL,以便能够与C#应用程序通信纯C ++ DLL。普通的C ++ DLL是第三方提供的,我无法对其进行修改。
该纯C ++ DLL通过以下方式包含一些成员函数模板:
纯C ++ DLL头文件:
class pureCPP
{
template<typename T>
void usefulFunctionA(T &b, T const &a)
{
/* Implementation of the function */
}
}
所以我的想法是将其反映在CLI DLL头文件中:
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)。
这是我真正想要避免的事情,相反,我希望能够执行类似我公开的第一个代码这样的事情。
非常感谢。