结合泛型与模板的STL.NET探索

模板

  开始之前,先来看一个笑话,当问一个C++程序员怎样完成一个给定的任务时,他(她)可能会提供一打或更多的潜在解决方案列表,但又会极其详细地标出每种方案的问题之处,让你不知所措,难以选择。而Visual C++ 2005,通过C++/CLI语言联编,引入了泛型的概念,使C++程序员可进一步提高程序的开发效率。关于 .NET泛型与C++模板,尽管句法上很相似,但泛型与模板是以完全不同的方法实现的,它们之间没有任何的内置兼容性。

  说到泛型与模板的差别,相信每个 .NET平台的C++程序员都会问这个问题:我该选择哪种技术呢?那些已用C++进行了数年开发(特别是用Visual C++)的人,相信早已知道答案:两种技术都具有卓越的特性,但任何一者都不是另一者的超集,使用何种技术只限于给定的任务,简而言之,没有一种技术可以适用于所有情况下的解决方案。同样,这种进退两难的状况也折磨了Visual C++程序员数年:Win32或是MFC、ATL或是WTL、COM或是C风格的DLL、#import或是CComPtr。

  涉及 .NET开发的C++知识

  在过去,Visual C++利用某些技术手段,可使STL中的集合与其他技术协同工作,如在活动模板库(ATL)中称为CComEnuOnSTL的模板化类,它允许一个Visual Basic客户端使用For Each来枚举由C++ COM服务器提供的STL集合的内容。虽然这种层次上的集成非常之浅,但在许多受限情况下证实非常有用。基于同样的主旨,STL.NET为C++程序员提供了标准STL库的一种扩展,这种扩展可允许在一个C++/CLI程序集内部使用的STL集合,作为泛型集合暴露给其他的 .NET程序集。

  STL.NET提供了与标准STL集合相同的接口,因此,对熟悉标准STL集合与算法的C++程序员来说,不存在学习曲线。以Visual C++ 2005来作说明,STL.NET的头文件位于Cliext目录中,如果要使用STL.NET集合,例如vector,必须包含<cliext/vector>而不是标准的<vector>,另外,STL.NET集合包含在cliext命名空间中,而不是标准STL集合所使用的std命名空间。

  注:Visual C++开发小组仍在努力工作使STL.NET变得更易使用,并提高它的性能。因为STL.NET仍在不断地进行新的改进,本文将不会探讨STL.NET集合的过深之处,而会从一种更高的角度来看,为什么STL.NET将会大有作为。

  桥接泛型与模板

  桥接泛型与模板这两个不同的世界,实属一项艰巨的任务。模板只是一个C++的概念,并只存在于编译时期;然而,泛型是一个 .NET概念,它存在于已编译的程序集中,并对所有 .NET语言可用。STL.NET所使用的解决方案是把类集当作C++模板类来实现,同时C++模板类也是 .NET引用类型,并由其实现了ICollection泛型接口。STL与STL.NET中vector的声明演示了这种设计:

//STL vector 声明
template<class _Ty, class _Ax = allocator<_Ty> >
class vector;

//STL.NET vector 声明
template<typename _Value_t>
ref class vector : Generic::ICollection<_Value_t>
  在这两者的声明当中,有一些关键的不同之处,除泛型接口的实现之外,STL.NET vector并不能指定一个分配算符,只是简单地调用gcnew来分配一个新的所需元素。STL.NET集合声明时使用了ref关键字,这意味着它们都是 .NET引用类型,将会被分配在 .NET托管堆中。

  使用STL.NET

  除去STL.NET集合声明时的一些差异(这个差异与C++/CLI和标准C++间的句法差异有关),使用STL.NET集合与STL集合基本上一模一样。以下的控制台示例程序声明了一个vector对象,接着在集合中加入了一些其他不同类型的元素:

#include "stdafx.h"
#include <cliext/vector>

using namespace System;
using namespace cliext;

int main(array<System::String ^> ^args)
{
 vector<Object^>^ v = gcnew vector<Object^>;
 v->push_back(nullptr); //第一个元素为空
 v->push_back(gcnew Object()); //第二个元素为一个纯对象
 v->push_back(1); //第三个元素为装箱的整数
 v->push_back("Element Four"); //第四个元素为字符串
 return 0;
}
  以上代码演示了STL.NET的一个重要特点:仍旧是非常熟悉的集合类,另一个特点是,可在一个集合中使用两种不同的编程模型,这意味着如果要查找上述代码中的整数1,可使用下列STL find算法:

//当作STL集合使用
bool containsOneSTL = find( v->begin( ), v->end( ), 1 ) != v->end();
  另外,.NET中ICollection泛型接口也能用于实现同样的逻辑:

//当作 .NET集合使用
bool containsOnedotNet = v->Contains(1);
  这种可在同一集合类中同时使用STL和 .NET算法的能力--而无须复制内容或提供桥接函数--允许C++/CLI程序员对任何有关集合的操作,选择最恰当的函数与库。

  有关STL.NET最后一个特点是,可为用C#或VB.NET编写的 .NET程序集,无缝地提供其STL.NET集合。由于STL.NET集合实现了ICollection泛型接口,所以在类型安全上,再无任何损耗,再者,STL.NET集合使用了托管内存来存储集合中的元素,因此,在与那些提供STL.NET集合的C++/CLI程序集互操作时,再无任何性能或代码安全性方面的损耗。

  .NET王国C++程序员的入场券

  STL.NET代表了Visual C++产品的一个重要部分,其允许C++程序员利用他们现有的技能与经验,尽早使用上带成强大集合与算法的类库,而不至于被快速成长的 .NET世界拒之门外。

  STL.NET作为一个光明的开端,将有助于C++在保持语言光荣传统的同时,成为 .NET语言开发的第一类选择。

时间: 2024-08-31 05:36:06

结合泛型与模板的STL.NET探索的相关文章

STL学习系列之二:标准模板库(STL)介绍

此文为转贴文章,由于原文运行在Linux下,我在vc6/7下进行调试,作了部分修改!注意:所有的代码在vc6/vc7下调试通过!标准模板库(STL)介绍 标准模板库(STL)介绍 0 前言. 1 定义一个list 2 使用list的成员函数push_back和push_front插入一个元素到list中 3 list的成员函数empty() 4 用for循环来处理list中的元素 5 用STL的通用算法for_each来处理list中的元素 6 用STL的通用算法count_if()来统计lis

STL学习系列之一——标准模板库STL介绍

库是一系列程序组件的集合,他们可以在不同的程序中重复使用.C++语言按照传统的习惯,提供了由各种各样的函数组成的库,用于完成诸如输入/输出.数学计算等功能. 1. STL介绍 标准模板库STL是当今每个从事C++编程的人需要掌握的技术,所有很有必要总结下 本文将介绍STL并探讨它的三个主要概念:容器.迭代器.算法. STL的最大特点就是: 数据结构和算法的分离,非面向对象本质.访问对象是通过象指针一样的迭代器实现的: 容器是象链表,矢量之类的数据结构,并按模板方式提供: 算法是函数模板,用于操作

用标准模板库STL实现文件比较

要阅读本文,你要熟悉C++,熟悉类模板和函数模板.本文汇集了大量有关的信息,指引你逐步阅读. 本文用提问,设计和解决方案引导阅读.希望你能喜欢. 问题提出: 有二篇文章都含有许多行文字.我们要建立一个程序来找出二者之间的不同之处并将这些不同内容的行显示出来.程序必须做成可重复使用的组件,就是说,这个组件能够未经修改地被其他程序使用. 设计: 假设这二个文件非常之大(每个文件都有数千行),我们这样设计有关解决方案: 将各个文件读进内存块, 在内存块中进行文件内容比较, 将不同之处放进一个新的第三个

【C/C++学院】(12)C++标准模板库STL

1.简介          STL的代码从广义上讲分为三类:algorithm(算法).container(容器)和iterator(迭代器).  2.vector向量 #include "iostream" #include "vector" using namespace std; //== != [] = //(vector<int>模板类型 void printfArray(vector<int> &v) { int size

泛型和模板设计模式

当两个或多个功能很大一部分实现都一样,只有其中一部分处理逻辑不同的情况下.我们通常都会采用模板设计模式来实现,这样既可以满足功能的需求也可以很好地实现代码的维护.这也正是设计模式的精髓所在.但是,如果有这样一个需求,该如何实现呢?既满足了模板设计模式的条件,也就是说两个或多个功能的总体实现流程是一致的,只是部分处理逻辑上存在差异:但有点特别的是根据不同的功能,返回值类型有所差别.这样的情况下我们可以通过模板设计模式结合泛型来很好地实现相应的功能. 技术要点 我们先来看下模板设计模式的技术点,模板

从C++到.NET:将模板映射到泛型

本文配套源码 讨论 ISO-C++ 文本查询语言 (TQL) 应用程序到 Microsoft .NET Framework 和 C++/CLI 的转换.特别是,我将深入讨论如何将模板和标准模板库 (STL) 映射到 .NET 泛型工具.尽管在 1991 年,我曾在贝尔实验室从事过 Cfront 3.0 版的最初模板实现,并曾极力提倡使用这些模板,但我建议不要在 C++/CLI 中使用模板. 在 .NET 下,C++ 模板实例化的静态特性使其无法成为 C++/CLI 的"一等公民".在语

泛型编程深入探索(二) 模板递归与可变参数模版

以构建一个n纬网格为例,讲述模板递归. 首先是一个简单的一纬网格的实现,这个网格实现了规定长度的网格的实例化,并且能够在不同大小的网格类中自由的转型(通过模版嵌套的cast_ctr) (使用到的技术,非类型参数模版,模版嵌套,类模版特例化,模版友元函数) #include <cassert> #include <iostream> using namespace std; template <typename T,int LENGTH> class grid; temp

Linux下c++编程中,STL模板的使用。

问题描述 Linux下c++编程中,STL模板的使用. Linux下c++编程,使用STL模板,为什么只识别#include 而不识别#include ? 程序中只要有#include 就会报无数多个错! 解决方案 难道c++标准模板库STL中没有包含queue,你可以去根目录去看看include头文件中有没有queue.h 解决方案二: STL头文件目录是否被include进项目中,如果自己写makefile的话,查看下INCLUDE的目录,如果IDE的话就查看下项目设置中的include选项

STL学习小结 .

from:http://blog.csdn.net/byxdaz/article/details/4633826#comments STL就是Standard Template Library,标准模板库.这可能是一个历史上最令人兴奋的工具的最无聊的术语.从根本上说,STL是一些"容器"的集合,这些"容器"有list, vector,set,map等,STL也是算法和其它一些组件的集合.这里的"容器"和算法的集合指的是世界上很多聪明人很多年的杰作