对话框模板 RegexTest
2006-07-19 11:31:19 来源:WEB开发网对于我的包装库,其实要说它的“累赘”,只不过是一层使之能编译的薄薄糖衣。顶多添加了一个额外的函数调用,因为每个包装器对象只是一个托管对象句柄。正像我在四月份的文章(“Wrappers: Use Our ManWrap Library to Get the Best of .NET in Native C++ Code”)中所指出的那样,函数调用对于大多数应用程序来说无关紧要。此外,我之所以选择 regex,只是以此为例;我的主要目的是创建一种通用机制来包装任何框架类。最终,如果你使用的是老版本编译器不支持 /clr,或者出于某种原因想避免使用 /clr,那么你只需要用包装器即可。要不然就撇开包装器,直接通过托管扩展调用框架。
现在我已经消除了误解,我必须承认,当我得知 ATL 模板库有一个 regex 类后,尽管我的孤陋寡闻使我有些忐忑不安,但我还是十分兴奋的。当我收到你的 e-mail 后做的第一件事情是将测试程序从使用 .NET 库的 ManWrap 移植到 ATL。我想看看是不是很容易做到。我碰到了一些小麻烦,但没有费什么周折就解决了。
与 .NET 框架相比,ATL 实现的 regex 比较原始,但它在多数情况下表现不错。ATL 使用两个模板类:一个是 CAtlRegExp,用于操作正则表达式;另一个是 CAtlREMatchContext,用于处理匹配。这两个模板由另一个描述字符集特性(例如,ASCII,WCHAR 或多字节)的类参数化。在实际应用中,你可以将此忽略掉,因为 ATL 模板根据你对 _UNICODE 的设置提供默认的字符集特性 CAtlRECharTraits:
// in atlrx.h
#ifndef _UNICODE
typedef CAtlRECharTraitsA CAtlRECharTraits;
#else
typedef CAtlRECharTraitsW CAtlRECharTraits;
#endif
template <class CharTraits=CAtlRECharTraits>
class CAtlRegExp; // forward declaration
从效果上讲,所有的 ATL regex 默认使用 TCHARs。所以在 ATL 中要创建正则表达式可以这样写:
更多精彩
赞助商链接