首页 > 学技术 > 技术网文 > C/C++ > 正文

[原创] 发布一个小小的template string library


来源 chinaunix.net kuqin整理

用模板元编程实现的 "字符串" "函数" 库。
支持的 "函数" 举例:
u_strlen: 计算长度
u_strcat: 合并两个字符串
u_substr: 取得子串
u_get_char_at: 取得特定位置的字符
u_strchr: 查找字符在串中最先出现的位置
u_strrchr: 查找字符在串中最后出现的位置
u_strstr: 查找子串在串中最先出现的位置
u_strrstr: 查找子串在串中最后出现的位置

字符串模板基于一个type array结构,所有运算都可以在编译时完成。
起初的用途是在另一个项目里,用来提供更好的正则表达式匹配。

(比较郁闷的是,写完发现用boost里面的mfl,可以极其轻松的完成类型数组的功能,
早看一下就不用自己写复杂的type array了)

简单的示例如下(附件是完整代码):

#include <cstdio>
#include "./include/u_type_string.hpp"
using namespace utl;

template <class T, class P, unsigned int position>
struct __print_char
{
inline static void callback (P &param)
{
//printf ("%c - %d\n", T::m_ch, position);
printf ("%c", T::m_ch);
}
};

template <typename S>
inline void print_str ()
{
typedef typename u_regular_str <S>::string_t string_t;

//采用for each模板将字符逐个打印出来。
u_tarr_for_each_range <string_t, __print_char, const int, 0, u_strlen <S>::m_length> (0);
printf ("\n");
}


int main ()
{
/* <1> Define string1: "abcd" */
typedef u_str <'a', 'b', 'c', 'd'> string1;
/* Print string1 */
print_str <string1> ();
/* Print length of string1 */
printf ("length is: %d\n", u_strlen <string1>::m_length);


/* <2> Test strcat */
typedef u_str <'1', '2', '3'> string2;
typedef u_strcat <string1, string2> string3;
typedef u_strcat <string3, string2> string4;
/* Print string4 */
print_str <string4> ();


/* <3> Test strchr and strrchr */
printf ("Search first char in string: %d\n",
u_strchr <string4, 's'>::m_position);
printf ("Search last char in string: %d\n",
u_strchr <string4, '2'>::m_position);

/* <4> Test strstr and strrstr(last index of substring) */
printf ("Search first sub-string in string: %d\n",
u_strstr <string4, string2>::m_index);
printf ("Search last sub-string in string: %d\n",
u_strrstr <string4, string2>::m_index);

/* <5> Test substr */
typedef u_substr <string4, 2> sub_string;
printf ("sub-string: ");
print_str <sub_string> ();

/* <6> Test get_char_at */
printf ("Char at 0: %c\n",
(char) u_get_char_at <sub_string, 0>::m_ch);
printf ("Char at 2: %c\n",
(char) u_get_char_at <sub_string, 2>::m_ch);


return 0;
}


string.zip



 converse 回复于:2007-04-08 22:34:50

给兄弟加精,但是我怀疑这样的代码在中国程序员的水平中是不是能达到合作的效果...

我在CSDN逛得时候,看到有的公司规定代码中不能用STL的,更不用说是这样的技巧了.上次看了两章MCD我就不打算继续看下去了,无他,不想玩弄一些华而不实的技术.


 flw 回复于:2007-04-08 22:42:31

每当我看到 C++ 的模板时,我就为 Perl 遭受到的攻击感到愤愤不平——Perl 代码再怎么着,那也比模板好读啊……


 tyc611 回复于:2007-04-08 22:49:28

引用:原帖由 flw 于 2007-4-8 22:42 发表
每当我看到 C++ 的模板时,我就为 Perl 遭受到的攻击感到愤愤不平——Perl 代码再怎么着,那也比模板好读啊…… 


呵呵,习惯了就好,就是一行代码长点,一般会超过80,呵呵


 zwylinux 回复于:2007-04-08 22:50:14

挺好的,赞一个
正准备读一下lz的代码,学习一下
不过,对于我来说,阅读别人的代码一直是比较头痛的事情,主要是不知道该怎么开始,还有怎么把各个模块联系起来。


 lenovo 回复于:2007-04-08 23:06:22

引用:原帖由 converse 于 2007-4-8 22:34 发表
给兄弟加精,但是我怀疑这样的代码在中国程序员的水平中是不是能达到合作的效果...

我在CSDN逛得时候,看到有的公司规定代码中不能用STL的,更不用说是这样的技巧了.上次看了两章MCD我就不打算继续看下去了,无他, ... 


嗯,模版看了些就不想看了。
感觉越看越复杂,很晕。
而实际上又用不到。


 flw 回复于:2007-04-08 23:07:51

引用:原帖由 lenovo 于 2007-4-8 23:06 发表

嗯,模版看了些就不想看了。
感觉越看越复杂,很晕。
而实际上又用不到。 


re


 tyc611 回复于:2007-04-08 23:11:29

引用:原帖由 lenovo 于 2007-4-8 23:06 发表

嗯,模版看了些就不想看了。
感觉越看越复杂,很晕。
而实际上又用不到。 


一些基本的还是有用的,少了很多手工工作
太复杂的看起来同晕:roll:


 flw 回复于:2007-04-08 23:12:34

引用:原帖由 tyc611 于 2007-4-8 23:11 发表

一些基本的还是有用的,少了很多手工工作
太复杂的看起来同晕:roll: 


re


 飞灰橙 回复于:2007-04-08 23:14:13

引用:原帖由 zwylinux 于 2007-4-8 22:50 发表
挺好的,赞一个
正准备读一下lz的代码,学习一下
不过,对于我来说,阅读别人的代码一直是比较头痛的事情,主要是不知道该怎么开始,还有怎么把各个模块联系起来。 



sorry, 模板库只要看着例子能用即可。里面的实现代码,实在不想害大家,我自己看了也头晕啊!


 flw 回复于:2007-04-08 23:15:36

引用:原帖由 飞灰橙 于 2007-4-8 23:14 发表

sorry, 模板库只要看着例子能用即可。里面的实现代码,实在不想害大家,我自己看了也头晕啊! 


re


 i802 回复于:2007-04-08 23:18:36

看不太懂,支持一下。


 飞灰橙 回复于:2007-04-08 23:23:34

引用:原帖由 converse 于 2007-4-8 22:34 发表
给兄弟加精,但是我怀疑这样的代码在中国程序员的水平中是不是能达到合作的效果...

我在CSDN逛得时候,看到有的公司规定代码中不能用STL的,更不用说是这样的技巧了.上次看了两章MCD我就不打算继续看下去了,无他, ... 



:mrgreen: 谢加精!
确实有点华而不实,其实这样做,一是想加速正则表达式,其二还是纯粹有趣而已。
另一个考虑是最近在想一个基于template的GUI库,
类似wtl的那种,但我想包个跨平台的。其中的图像资源,我想通过文件名即可确定引入哪个图像库,
用这个字符串模板从常量文件名中提取扩展名,再由扩展名作为模板参数特化,决定引入的图像库,
那是再好不过了。否则即使用const char *的文件名,为了显示jpeg, 也不得不把其他各种的图像库
全部link近来。(不过想想而已,这个库貌似还遥遥无期)

[ 本帖最后由 飞灰橙 于 2007-4-8 23:33 编辑 ]


 飞灰橙 回复于:2007-04-08 23:24:50

引用:原帖由 flw 于 2007-4-8 22:42 发表
每当我看到 C++ 的模板时,我就为 Perl 遭受到的攻击感到愤愤不平——Perl 代码再怎么着,那也比模板好读啊…… 



Perl那是写诗用的,C++这种东西根本不能和Perl比。


 converse 回复于:2007-04-08 23:36:21

>>基于template的GUI库
我推荐你看看CEGUI,最好的开源游戏UI库,代码风格也很好,我当初看的时候学了不少东西,而且里面没有用到太复杂的技巧,但是和脚本,配置文件的结合(lua,XML)还有设计模式方面做的很好.


 飞灰橙 回复于:2007-04-08 23:45:31

引用:原帖由 converse 于 2007-4-8 23:36 发表
>>基于template的GUI库
我推荐你看看CEGUI,最好的开源游戏UI库,代码风格也很好,我当初看的时候学了不少东西,而且里面没有用到太复杂的技巧,但是和脚本,配置文件的结合(lua,XML)还有设计模式方面做的很好. 



嗯看看,有点意思哦


 converse 回复于:2007-04-08 23:49:30

引用:原帖由 飞灰橙 于 2007-4-8 23:45 发表


嗯看看,有点意思哦 



里面的UI布局都是可以通过XML文件进行配置的,程序解析XML文件来自动生成UI.

UI中的各个事件又可以通过lua的脚本来实现调用.


 emacsnw 回复于:2007-04-09 07:02:58

不错不错。估计实际中用不大到。


 BenBear 回复于:2007-04-17 14:45:58

非常不错,虽然曾经我以为编译期的字符串没办法弄:)

用途可能不大,但是作为技术验证,非常的好:)




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=921224
转载请注明作者名及原文出处



收藏本页到: