免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4174 | 回复: 18
打印 上一主题 下一主题

发布一个小小的template string library [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-08 21:58 |只看该作者 |倒序浏览
用模板元编程实现的 "字符串" "函数" 库。
支持的 "函数" 举例:
u_strlen: 计算长度
u_strcat: 合并两个字符串
u_substr: 取得子串
u_get_char_at: 取得特定位置的字符
u_strchr: 查找字符在串中最先出现的位置
u_strrchr: 查找字符在串中最后出现的位置
u_strstr: 查找子串在串中最先出现的位置
u_strrstr: 查找子串在串中最后出现的位置

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

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

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

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

  4. template <class T, class P, unsigned int position>
  5. struct __print_char
  6. {
  7.         inline static void callback (P &param)
  8.         {
  9.                 //printf ("%c - %d\n", T::m_ch, position);
  10.                 printf ("%c", T::m_ch);
  11.         }
  12. };

  13. template <typename S>
  14. inline void print_str ()
  15. {
  16.         typedef typename u_regular_str <S>::string_t string_t;

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


  21. int main ()
  22. {
  23.         /* <1> Define string1: "abcd" */
  24.         typedef u_str <'a', 'b', 'c', 'd'> string1;
  25.         /* Print string1 */
  26.         print_str <string1> ();
  27.         /* Print length of string1 */
  28.         printf ("length is: %d\n", u_strlen <string1>::m_length);


  29.         /* <2> Test strcat */
  30.         typedef u_str <'1', '2', '3'> string2;
  31.         typedef u_strcat <string1, string2> string3;
  32.         typedef u_strcat <string3, string2> string4;
  33.         /* Print string4 */
  34.         print_str <string4> ();


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

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

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

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


  54.         return 0;
  55. }
复制代码

string.zip

13.39 KB, 下载次数: 129

论坛徽章:
0
2 [报告]
发表于 2007-04-08 22:34 |只看该作者
给兄弟加精,但是我怀疑这样的代码在中国程序员的水平中是不是能达到合作的效果...

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
3 [报告]
发表于 2007-04-08 22:42 |只看该作者
每当我看到 C++ 的模板时,我就为 Perl 遭受到的攻击感到愤愤不平——Perl 代码再怎么着,那也比模板好读啊……

论坛徽章:
0
4 [报告]
发表于 2007-04-08 22:49 |只看该作者
原帖由 flw 于 2007-4-8 22:42 发表
每当我看到 C++ 的模板时,我就为 Perl 遭受到的攻击感到愤愤不平——Perl 代码再怎么着,那也比模板好读啊……

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

论坛徽章:
0
5 [报告]
发表于 2007-04-08 22:50 |只看该作者
挺好的,赞一个
正准备读一下lz的代码,学习一下
不过,对于我来说,阅读别人的代码一直是比较头痛的事情,主要是不知道该怎么开始,还有怎么把各个模块联系起来。

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2007-04-08 23:06 |只看该作者
原帖由 converse 于 2007-4-8 22:34 发表
给兄弟加精,但是我怀疑这样的代码在中国程序员的水平中是不是能达到合作的效果...

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

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2007-04-08 23:07 |只看该作者
原帖由 lenovo 于 2007-4-8 23:06 发表

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

re

论坛徽章:
0
8 [报告]
发表于 2007-04-08 23:11 |只看该作者
原帖由 lenovo 于 2007-4-8 23:06 发表

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

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

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2007-04-08 23:12 |只看该作者
原帖由 tyc611 于 2007-4-8 23:11 发表

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

re

论坛徽章:
0
10 [报告]
发表于 2007-04-08 23:14 |只看该作者
原帖由 zwylinux 于 2007-4-8 22:50 发表
挺好的,赞一个
正准备读一下lz的代码,学习一下
不过,对于我来说,阅读别人的代码一直是比较头痛的事情,主要是不知道该怎么开始,还有怎么把各个模块联系起来。


sorry, 模板库只要看着例子能用即可。里面的实现代码,实在不想害大家,我自己看了也头晕啊!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP