不可理解的语法,来自vc++;到c# 我有下面的代码,这对于理解我正在从VisualC++到C<的类非常重要。 typedef Rect Rect2;

不可理解的语法,来自vc++;到c# 我有下面的代码,这对于理解我正在从VisualC++到C<的类非常重要。 typedef Rect Rect2;,c#,visual-c++,syntax,C#,Visual C++,Syntax,我简直不明白这是什么意思。我逐渐了解到vc++使用'stl'或'std'和'vector'类,这类似于c#list或arraylist,但我完全无法理解其语法 对了,Rect定义是这样写的 template<class Real, int Dim> class Rect { 模板 类矩形{ Rect是vc++项目文件中的一个类,但我不明白这个typedef有什么意义。它有200多行,所以这里是声明的开始 template<class Real, int Dim> cl

我简直不明白这是什么意思。我逐渐了解到vc++使用'stl'或'std'和'vector'类,这类似于c#list或arraylist,但我完全无法理解其语法

对了,Rect定义是这样写的

template<class Real, int Dim>
class Rect {
模板
类矩形{
Rect是vc++项目文件中的一个类,但我不明白这个typedef有什么意义。它有200多行,所以这里是声明的开始

template<class Real, int Dim>
class Rect {
public:

typedef Vector<Real, Dim> Vec;
typedef Rect<Real, Dim> Self;
typedef _RectPrivate::RectOp<Dim> RO;

Rect() : empty(true) {}
Rect(const Vec &vec) : empty(false), lo(vec), hi(vec) {}
Rect(const Vec &inLo, const Vec &inHi) : lo(inLo), hi(inHi) { markEmpty(); }
Rect(const Rect &inRect) : empty(inRect.empty), lo(inRect.lo), hi(inRect.hi) {}
template<class R> Rect(const Rect<R, Dim> &inRect) : empty(inRect.empty), lo(inRect.lo), hi(inRect.hi) {}
模板
类矩形{
公众:
类型定义向量向量向量;
类型定义直接自我;
typedefu RectPrivate::RectOp RO;
Rect():空(真){}
Rect(const-Vec&Vec):空(false)、低(Vec)、高(Vec){
Rect(const-Vec&inLo,const-Vec&inHi):lo(inLo),hi(inHi){markEmpty();}
Rect(const Rect&inRect):空(inRect.empty)、lo(inRect.lo)、hi(inRect.hi){
模板Rect(const Rect&inRect):空(inRect.empty)、lo(inRect.lo)、hi(inRect.hi){

感谢您的帮助。

它为(别名)
Rect
创建了一个替代名称。 Rect是一个类模板,与C#中的泛型有些相似。
所以,代码> > RUTS< /COD> <代码>实际=双//>和<代码> DIM=2

> P>根据您对另一个答案的评论,您所面临的问题是,您不理解C++模板是什么。它们实际上与C仿泛型有很大的不同。它们在概念上是相似的,在语法上相似,但它们的AC。实际实现是非常不同的

在C++中,考虑模板的最简单的方法是“查找和替换”机制。当你看到

typedef Rect<double, 2> Rect2;

<> P.C.泛型与C++模板有很多不同之处,这里的明显区别是C类泛型只能用类型来参数化,而不是用模板中的值来进行。另外一个不同之处是C++模板在编译时完全构造,只需要在实际的参数GI中进行合法构造即可。在程序中,C泛型必须用满足指定约束的任何参数来构造,新的代码生成不会在运行时发生。

可以为“代码> ReCT语句。例如,如果您使用xxx=System.Web.HttpContext;将
放在文件顶部(在其他
旁边,使用那里的
s),然后在下面您可以使用
xxx
作为
System.Web.HttpContext
的同义词。谢谢。所以我想我开始理解:这个typedef Rect2;不是一个实例,而是一个实际的类型?那么,请问模板到底是什么意思?@roamcel“真实”是什么类。代码中没有实数的类或类型定义。我不知所措。“而C#泛型必须可以使用满足所述约束的任何参数进行构造,并且新的代码生成直到运行时才会发生。”您能解释一下这是什么意思吗?使用泛型时听起来像是性能损失,但事实并非如此。这意味着JIT将根据其类型参数为每个泛型类型创建一个唯一的类型,然后缓存它以供进一步使用。这就是为什么SomeClass和SomeClass在运行时是两个独立的类型。@lukas,什么样的性能你说的是惩罚吗?如果你在C#中有一个泛型类,并将它与N组不同的类型参数一起使用,那么它的本机代码在运行时可能需要生成N次。但这在整个程序执行过程中只发生一次,所以实际的惩罚很小。C++/CLI中的模板也有同样的惩罚。I guess我可能误解了你所说的惩罚。谢谢你的透彻解释。现在它有意义了。@lukas:在运行时使用泛型会有性能和空间方面的惩罚,因为第一次使用泛型时必须在运行时对其进行编码。但是,每个应用域每次构造只发生一次编码。Mor此外,两个构造都是使用类型参数的引用类型构造的,只会招致一次惩罚。因此,当您创建第一个
列表时,您可以免费获得
列表
。此外,通过使用值类型构造的泛型,您可以获得第一次调用jit成本,但可以消除每次调用装箱成本。
typedef Rect<double, 2> Rect2;
template<class Real, int Dim>
class Rect {
typedef /* now we start replacing double for Real and 2 for Dim */ 
class Rect {
public:
typedef Vector<double, double> Vec;
typedef Rect<double, 2> Self;
typedef _RectPrivate::RectOp<2> RO;
Rect() : empty(true) {}
Rect(const Vec &vec) : empty(false), lo(vec), hi(vec) {}
...
} Rect2;
using MyStringList = System.Collections.Generic.List<string>;