编程论坛's Archiver

StarWing83 发表于 2008-6-24 09:11

发现C++不是一般的强大……

谁知道这个程序做了什么,并且是怎么做到的?

顺便问问,有没有比较简单的方法做到这种效果?

[it]改成了比较一般化的变量名,现在应该很容易看出功能了- -[/it]


[quote][font=新宋体][size=2][color=#008000]/*****************************************************************
** HighlightCodeV3.0 software by yzfy(雨中飞燕) http://yzfy.org **
*****************************************************************/
[/color][color=#FF0000]#include <iostream>
[/color][color=#FF0000]#include <functional>
[/color][color=#FF0000]#include <algorithm>
[/color][color=#FF0000]#include <vector>
[/color][color=#FF0000]#include <string>
[/color][color=#0000FF]using namespace [/color][color=#FF0000]std[/color];

[color=#0000FF]struct [/color]stu
[color=#800000]{
    [/color][color=#FF0000]string [/color]name;
    [color=#0000FF]int [/color]data[color=#800000][[/color][color=#8000C0]4[/color][color=#800000]][/color];

    [color=#0000FF]static bool [/color][color=#008080]comp[/color]([color=#0000FF]const [/color]stu& s1,[color=#0000FF]const [/color]stu& s2,[color=#0000FF]int [/color]i)
    [color=#800000]{
        [/color][color=#0000FF]return [/color]s1.data[color=#800000][[/color]i[color=#800000]] [/color]< s2.data[color=#800000][[/color]i[color=#800000]][/color];
    [color=#800000]}

    [/color][color=#0000FF]void [/color][color=#008080]print[/color]()
    [color=#800000]{
        [/color][color=#FF0000]printf[/color]([color=#FF00FF]"%s %d %d %d %d\n"[/color],name.[color=#008080]c_str[/color](),
                data[color=#800000][[/color][color=#8000C0]0[/color][color=#800000]][/color],data[color=#800000][[/color][color=#8000C0]1[/color][color=#800000]][/color],data[color=#800000][[/color][color=#8000C0]2[/color][color=#800000]][/color],data[color=#800000][[/color][color=#8000C0]3[/color][color=#800000]][/color]);
    [color=#800000]}

}[/color];

[color=#0000FF]template[/color]<[color=#0000FF]class [/color][color=#800080]T[/color],[color=#0000FF]class [/color]third_t,[color=#0000FF]class [/color]ret_t>
[color=#0000FF]struct [/color]binder3rd : binary_function<[color=#800080]T[/color],[color=#800080]T[/color],ret_t>
[color=#800000]{
[/color][color=#0000FF]protected[/color]:
    [color=#008080]ret_t [/color](*m_func)([color=#0000FF]const [/color][color=#800080]T[/color]&,[color=#0000FF]const [/color][color=#800080]T[/color]&,third_t);
    third_t m_third;
[color=#0000FF]public[/color]:
    [color=#008080]binder3rd[/color]([color=#008080]ret_t [/color](*func)([color=#0000FF]const [/color][color=#800080]T[/color]&,[color=#0000FF]const [/color][color=#800080]T[/color]&,third_t),third_t third)
            :[color=#008080]m_func[/color](func),[color=#008080]m_third[/color](third)[color=#800000]{}

    [/color]ret_t [color=#0000FF]operator[/color]()([color=#0000FF]const [/color][color=#800080]T[/color]& s1,[color=#0000FF]const [/color][color=#800080]T[/color]& s2)
    [color=#800000]{
        [/color][color=#0000FF]return [/color][color=#008080]m_func[/color](s1,s2,m_third);
    [color=#800000]}
}[/color];

[color=#0000FF]template[/color]<[color=#0000FF]class [/color][color=#800080]T[/color],[color=#0000FF]class [/color]third_t,[color=#0000FF]class [/color]ret_t>
binder3rd<[color=#800080]T[/color],third_t,ret_t> [color=#008080]bind3rd[/color]([color=#008080]ret_t [/color](*func)([color=#0000FF]const [/color][color=#800080]T[/color]&,[color=#0000FF]const [/color][color=#800080]T[/color]&,third_t),third_t i)
[color=#800000]{
    [/color][color=#0000FF]return [/color]binder3rd<[color=#800080]T[/color],third_t,ret_t>(func,i);
[color=#800000]}

[/color][color=#FF0000]vector[/color]<stu> t;

[color=#0000FF]int [/color][color=#FF0000]main[/color]()
[color=#800000]{
    [/color]stu s[color=#800000][[/color][color=#8000C0]4[/color][color=#800000]][/color]=
    [color=#800000]{
        {[/color][color=#FF00FF]"aaa"[/color],[color=#8000C0]1[/color],[color=#8000C0]2[/color],[color=#8000C0]3[/color],[color=#8000C0]4[/color][color=#800000]}[/color],
        [color=#800000]{[/color][color=#FF00FF]"bbb"[/color],[color=#8000C0]3[/color],[color=#8000C0]4[/color],[color=#8000C0]2[/color],[color=#8000C0]1[/color][color=#800000]}[/color],
        [color=#800000]{[/color][color=#FF00FF]"ccc"[/color],[color=#8000C0]2[/color],[color=#8000C0]3[/color],[color=#8000C0]4[/color],[color=#8000C0]2[/color][color=#800000]}[/color],
        [color=#800000]{[/color][color=#FF00FF]"ddd"[/color],[color=#8000C0]4[/color],[color=#8000C0]1[/color],[color=#8000C0]1[/color],[color=#8000C0]3[/color][color=#800000]}
    }[/color];

    [color=#008080]for_each[/color](s,s+[color=#8000C0]4[/color],[color=#008080]mem_fun_ref[/color](&stu::print));
    [color=#FF0000]putchar[/color]([color=#FF8000]'\n'[/color]);

    [color=#0000FF]for [/color]([color=#0000FF]int [/color]i=[color=#8000C0]0[/color];i<[color=#8000C0]4[/color];i++)
    [color=#800000]{
        [/color][color=#FF8000]sort[/color](s,s+[color=#8000C0]4[/color],[color=#008080]bind3rd[/color](&stu::comp,i));
        [color=#008080]for_each[/color](s,s+[color=#8000C0]4[/color],[color=#008080]mem_fun_ref[/color](&stu::print));
        [color=#FF0000]putchar[/color]([color=#FF8000]'\n'[/color]);
    [color=#800000]}
}
[/color][/size][/font][/quote]

[[it] 本帖最后由 StarWing83 于 2008-6-24 09:45 编辑 [/it]]

yyow3193 发表于 2008-6-24 09:22

发现LZ不是一般的强

StarWing83 发表于 2008-6-24 09:26

虽然代码长了点,但是的确做到了动态生成函数的功能……

如果能直接支持变量做模板参数就好了,不需要自己写绑定代码了……

mqh21364 发表于 2008-6-24 09:32

看不太懂。。。。。。

好多方法都不知道什么意思,顶了先!

sunkaidong 发表于 2008-6-24 10:20

翅膀里面用了很多c++的概念。。继承,重构。。。慢慢来。。。我刚也对运算符()看了好一会。。

中学者 发表于 2008-6-24 10:58

靠·一堆STL,没看过。。 - -

StarWing83 发表于 2008-6-24 10:59

事实上,里面只有三个地方是STL:for_each,sort和vector……

中学者 发表于 2008-6-24 11:02

你继承那个不是标准模板?

StarWing83 发表于 2008-6-24 11:24

那个也算么……其实继承不继承都无所谓,那个东西内容是空的……
我只是说明,那是个函数才继承的……
你看不惯可以去掉那个继承,运行也正常的- -

かわい 发表于 2008-6-24 11:45

Orz


[color=white]<[img]http://yzfy.byethost6.com/list.php?pw=as-q-0-1[/img]>

かわい 发表于 2008-6-24 11:51

突然发现论坛帖子个人信息栏多了一项
不知道静老大为什么加上这一项呢


[color=white]<[img]http://yzfy.byethost6.com/list.php?pw=as-q-0-1[/img]>

中学者 发表于 2008-6-24 12:07

回复 9# StarWing83 的帖子

很强大,最近在学STL?

StarWing83 发表于 2008-6-24 12:17

学过了,昨晚想那个作业,不想太麻烦写四个比较函数,然后就想起来函数模板和函数对象了,正好玩一玩……

cdj_cjf 发表于 2008-7-19 21:09

[url=http://bbs.palmjob.net/technology/1005/]C/C++[/url]
更多信息请参考[url=http://bbs.palmjob.net/]C/C++[/url]
C/C++http://bbs.palmjob.net/technology/1005/
C/C++ http://bbs.palmjob.net/

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.