将CLI代码编写到C ++和C#之间的接口时,通常必须在函数调用中转换某些类型,以便它们可以在C#或C ++中使用。例如,std :: string显然不存在于C#中,因此您必须将其转换为String ^,反之亦然。
现在我想包装一个C ++类,它通过一个应该公开类似泛型方法的接口将模板化函数暴露给C#。为此,我编写了一个CLI ref类,它实现了C#接口,并保存了一个指向C ++类实例的指针:
// C#
public interface ISomeClass {
void SomeMethod<T>(T param);
}
//CLI
public ref class : ISomeClass {
public:
generic<typename T>
virtual void SomeMethod(T param) {
_nativePtr->NativeMethod<T>(param); // :(
}
// Implementation details...
};
// C++
class SomeNativeClass {
public:
template<typename T>
void NativeMethod(T&& nativeParam) { /*bla*/ }
};
在我的特定情况下(使用Visual Studio 2013),这会使编译器崩溃。虽然我不认为它应该崩溃,但我可以猜测这不应该工作,毕竟我不能直接将C#类型传递给C ++函数。我想要的是一些机制,通过它我可以将泛型类型'T'转换为C ++模板类型'U'。我尝试使用模板元编程,但这不适用于CLI中的C#泛型,因为泛型类不能专门化。
有没有办法让这项工作?