使用 C++ C# 中的 CLI 模板类
我在 C++/CLI 中有以下类以及 int 原语的显式模板实例化。
template<typename T>
public ref class Number
{
T _value;
public:
static property T MinValue
{
T get()
{
return T::MinValue;
}
}
static property T MaxValue
{
T get()
{
return T::MaxValue;
}
}
property T Value
{
T get()
{
return _value;
}
void set(T value)
{
if( value<MinValue || value > MaxValue)
throw gcnew System::ArgumentException("Value out of range");
_value = value;
}
}
};
template ref class Number<int>;
在编译它并使用反射器检查生成的程序集时,我可以看到一个名为 Number
的类,但是当尝试在 C# 中实例化同一个类时,编译器抱怨某些 System::Number
类未采用模板参数。 我究竟做错了什么? 这完全可以做到吗?
I have the following class in C++/CLI and an explicit template instantiation for the int primitive..
template<typename T>
public ref class Number
{
T _value;
public:
static property T MinValue
{
T get()
{
return T::MinValue;
}
}
static property T MaxValue
{
T get()
{
return T::MaxValue;
}
}
property T Value
{
T get()
{
return _value;
}
void set(T value)
{
if( value<MinValue || value > MaxValue)
throw gcnew System::ArgumentException("Value out of range");
_value = value;
}
}
};
template ref class Number<int>;
On compiling this and inspecting the generated assembly using reflector I am able to see a class called Number<int>
but while trying to instantiate this same class in C# the compiler complains about some System::Number
class not taking a template argument. What am I doing wrong? Can this be done at all?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我有一个解决方法,声明一个继承
Number
类的附加类。 该类现在在 C# 中可见并且可以实例化。I have a work around, declare an additional class inheriting the
Number<int>
class. This class is now visible in C# and can be instantiated.反射器位于此处稍远一点。 类的名称实际上不是 Number。 它实际上是“Number”。 注意单引号。 仅当您使用 ildasm 查看类型名称时,这些才可见。
我相信这样做是为了使类型在大多数语言中不可绑定,因为它们无法理解 C++ 模板的实际工作原理。 这使得它实际上只对 C++ 编译器可见,这是合适的,因为它是唯一真正支持模板(模板!=泛型)的 MS 编译器。
Reflector is lying a little bit here. The name of the class is not actually Number<int>. It is actually 'Number<int>'. Notice the single quotes. These are only visible when you view the type name with ildasm.
I believe this is done to make the type unbindable in most languages as they have no way of understanding how a C++ template actually works. This makes it effectively only visible to the C++ compiler which is appropriate since it's the only MS compiler that actually supports templates (templates != generics).
如果您的目标是在 C++ CLI 中创建参数化类型,然后使用 C# 中的该类型,我认为您需要创建泛型类型而不是模板类型(请参阅 Stan Lippman 的博客 了解两种方法存在的原因)。 有关如何在 C++ CLI 中创建泛型类型的信息,请参阅此处。
If your goal is to create a parametrized type in C++ CLI, and then use that type from C#, I think that you need to create a generic type rather than a template type (see Stan Lippman's Blog for the reasons why both methods exist). See here for information on how to create generic types in C++ CLI.