科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件Visual Studio 2005体验泛型编程

Visual Studio 2005体验泛型编程

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文简单介绍了泛型编程在Visual Studio 2005中的应用。泛型编程的基本思想是交付固定的代码库,这个代码库支持潜在的无限类型集合。

作者:佚名 来源:中国IT实验室 2007年12月11日

关键字:

  • 评论
  • 分享微博
  • 分享邮件

C++/CLI支持两种参数化类型机制,模板和泛型,用于定义参数化引用、值和接口类,函数和委托。从表面上看,参数化的generic和template至少在语句构成上是等同的(除了template或generic关键字有所不同)。而在其它方面,它们有显著的不同。

考虑一下Figure 2中的两个栈声明,template实例(tStack),通过标准模板库(STL)的CLI实现提供了一个使用动态vector容器的例子,以及generic实例(gStack),通过System::Collections::Generic名字空间提供的使用动态List<T>容器的例子。两者在Visual Studio 2005中都是新的参数化类型集合库。

Figure 2 Template and Generic Stack Declaration
C++/CLI Template Stack Declaration
#include <cliext/vector>
using namespace cliext;

template <class elemType>
ref class tStack
{
// the CLI vector is a reference class …
vector<elemType> ^m_stack;
int top;

public:
tStack();
elemType pop();
void push( elemType et );
...
};

C++/CLI Generic Stack Declaration
using namespace System::Collections::Generic

generic <class elemType>
public ref class gStack {
List<elemType> ^m_stack;
int top;

public:
gStack();
elemType pop();
void push( elemType et );
...
};

通过在类名后的尖括弧中指定实际类型来创建参数化类型实例。例如,Figure 3依次示范了用整型和字符串类型参数实例化的template堆栈。为了创建等同的generic堆栈实例,Figure 4所用的两种类型参数是相同的。

Figure 3 Instantiating the Template Stack
void demo_template_Stack()
{
// an int value type argument...

tStack<int>^ is = gcnew tStack<int>( 10 );
for ( int ix = 0; ix < 10; ix++ )
is->push( ix*2 );

int elem_cnt = is->size();
for ( int ix = 0; ix < elem_cnt; ++ix )
Console::WriteLine( "({0}) {1}", ix+1, is->pop());

// a String^ reference type argument...

tStack<String^> ^ss = gcnew tStack<String^>( 10 );
ss->push( "Pooh" ); ss->push( "Piglet" );
ss->push( "Rabbit" ); ss->push( "Eeyore" );

elem_cnt = ss->size();
for ( int ix = 0; ix < elem_cnt; ++ix )
Console::WriteLine( "({0}) {1}", ix+1, ss->pop());
}

Figure 4 Instantiating the Generic Stack

void demo_generic_Stack()
{
// an int value type argument...

gStack<int>^ is = gcnew gStack<int>( 10 );
for ( int ix = 0; ix < 10; ix++ )
is->push( ix*2 );

int elem_cnt = is->size();
for ( int ix = 0; ix < elem_cnt; ++ix )
Console::WriteLine( "({0}) {1}", ix+1, is->pop());

// a String^ reference type argument...

gStack<String^> ^ss = gcnew gStack<String^>( 10 );
ss->push( "Pooh" ); ss->push( "Piglet" );
ss->push( "Rabbit" ); ss->push( "Eeyore" );

elem_cnt = ss->size();
for ( int ix = 0; ix < elem_cnt; ++ix )
Console::WriteLine( "({0}) {1}", ix+1, ss->pop());
}

参数化类型对象的实际处理,例如is和ss,与非参数化类型对象的处理完全一样。参数化类型的一个好处是单一的源定义能潜在地产生出无数种型实例。该例子中,generic和template堆栈类在相同的参数化类源代码之外都支持字符串和整型类。在所有已知类型的应用程序中使用它们时没有真正的约束。正如你将会在后续专栏中看到的那样,并不是所有参数化类型都这样。

generic和template定义以及种型实例在这里几乎是等价的,尽管并不是所有的参数化类型都这样。或者说在支持两种机制的C++/CLI中益处不多。当我在后续专栏中详细讨论两种机制时,你会看到其它一些差异。正是存在这些差异,在我遇到它们时,将它突出出来,而不是反复说其共性,似乎是整合其全貌的更好方法。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章