2012年(158)
分类: C/C++
2012-11-19 11:02:29
有关模板的语法很多很杂,无法一一列举,在此仅测试几个简单常用的语法。
以下有关模板的语法分别使用 gcc3.4.2、VC++6.0 和 Intel
C++8.0 进行测试,GCC342和ICC都能完全通过测试,VC++6.0有部分通不过测试。
1. 模板类静态成员
template
static int
_data;
};
template<> int testClass
template<> int testClass
int main( void )
{
cout << boolalpha << (1==testClass
cout << boolalpha <<
(2==testClass
}
2.
模板类偏特化
template
testClass() { cout << "I, O" << endl; }
};
template
testClass() { cout
<< "T*, T*" << endl; }
};
template
testClass() { cout << "const T*,
T*" << endl; }
};
int main( void ) {
testClass
testClass
testClass
}
[注]: VC++6 编译不通过
3. function template partial
order
template
void swap(
testClass
};
template
x.swap( y );
}
int main( void )
{
testClass
testClass
swap( obj1, obj2 );
}
[注]: VC++6
编译不通过
4. 类成员函数模板
struct testClass {
template
cout << t <<
endl;
}
template
return
T();
}
};
int main( void ) {
testClass obj;
obj.mfun(
1 );
int i = obj;
cout << i << endl;
}
[注]:
对于第二个成员函数模板,VC++6 运行异常
5. 缺省模板参数推导
template
T a;
};
template
I b;
O c;
};
6.
非类型模板参数
template
T
_t;
testClass() : _t(n) {
}
};
int main( void )
{
testClass
testClass
}
7. 空模板参数
template
template
return
false;
};
template
friend bool
operator== <>( const testClass&, const testClass& );
};
[注]:
VC++6 编译不通过
8. 模板特化
template
};
template <> struct testClass
};
9.
template class
X>
struct Widget{
};
[注]: VC++6
编译不通过
10. [hpho]提供的一个事例
struct Widget1
{
template
T
foo(){}
};
templateclass X>
struct
Widget2{
};
[注]: VC++6 编译不通过
11.
数组作模板实参
template
{
cout << typeid(T).name() << " (&bar)[" << N
<< "]" << endl;
};
int main()
{
int a[10];
foo( a );
return 0;
}
[注]: VC++6
编译不通过
12. 模板作为模板的参数
template< class T, template
void Test( T, Y
{
}
[注]: VC++6 编译不通过
13.
template
{
foo() {}
foo( const foo& ) {}
template& ) {}
};
int
main()
{
foo
foo
foo
}
[注]:
网友评论2012-11-19 11:06:47
晴月浩雪
不使用MFC和相应的衍生和扩展库,编出一个类似VC6或VC7界面的复杂程序会变得异常困难。而VC6当初相对于VB6作GUI应用的一个优势就是作专业风格的界面方便一些。
COM本身不止是一项技术,对很多人来说更是一种设计思想,他让人们更重视面向接口的设计以及动态的基于事件的反馈模型。而且正式这个M$的技术,养活了国内外不少大大小小的公司,让很多程序员可以在VB、Delphi中使用其他人作好的组件进行二次开发,不用去学习VC或者从头自己开发。这些作用可以从COM在GIS平台、专业开发包、科学计算可视化、DirectX、Office等等无数大型平台软件和引擎的开发中被广泛采用得而得到验证。仅从这点考虑,COM的作用甚至ANSI C++(包括STL)还要大。
至于属性编程以及MFC/ATL结构的新调整,不研究COM是无法理会它的好处的,我认为他绝对不能被COM开发者所忽略。它让COM与非COM程序基本可以融为一体,具有相似的开发过程、项目组织形式和代码外观。
ATL Server虽然很好,但毕竟不是热门。
网友评论2012-11-19 11:06:31
周星星
要谈对C++标准的兼容性,莫过于g++/mingw,VC7.1/8.0还算不了什么,而且其经营方式不同,导致VC++不可能有g++更新速度快,再者g++/mingw是免费的,所以对于学者,或研究者而言,使用g++/mingw是首选(两个原因:对C++标准支持更好,免费获得)。
对于工程上的使用,考虑的东西就很多,比如顺手的IDE、编译速度、编译质量 等等。
顺手的IDE:你也应该承认VC++6.0的编辑界面是最干净的,而后来的VC编译器就有点变态了(个人感觉),比如自动显示/隐藏的属性页,鼠标总是动来动去的,不小心碰到了属性页,那么麻烦来了,得耐心的等待它隐藏起来,这种不时的中断完全打乱了我的思路;固定下来是个好办法,但界面上的垃圾功能太多了,如果固定下来,那么也就看不了几行源代码了。
编译速度:先不谈编译速度,就是VC++7.1的启动速度和反应速度慢得就够吓人的,对于小修改,我用VC++6.0修改、编译、发布完成时估计VC++7.1还像死机一样在那儿启动呐!有次(VC++7.1已经打开工程)我打开
网友评论2012-11-19 11:06:11
晴月浩雪
谢谢您的评论,但我和netsin的观点一致:没人用VC7.1和VC8.0。VC++6.0的唯一优点是其IDE做得不错,界面科学,速度也很快,而后来的VC++已经没有任何优点了。
--------------------------------------------------------
对这个观点我认为或许您应该重新考虑下是否恰当。
VC6的IDE当时也不算独一无二,而界面从VC5时候就已经成型了。VC6成功的主要原因在于优秀的类库(在当时)、丰富的文档、不错的速度和广泛的项目平台适用性。
VC7.1是个值得考虑换用的IDE。其本身对C++标准的兼容性就是一个很大的优点,STL/Boost/Loki的编译不再是问题。而对原有ATL/MFC库结构的很多改动也足以让人喜悦,更有趣的是属性编程和ATL Server方面,这些都让某些编程工作大大的简化,让项目代码更加整齐优雅。我认为他的改进很多,优点很多,应该属于VC系列最优秀的C++开发平台(注意,我没有评价任何与.NET相关的部分,那些不