一个更有趣的Obfuscated C++程序

myan 2001-02-25 05:47:00
#include <iostream>
#include <functional>
using namespace std;

template<class op>
void g(int size, op o, const char* sep = "") {
for(int i = 0; i < size; ++i)
cout << o(i) << sep;
}

template<class op,int size>
struct w {
char* operator()(int a) {
return g(size,binder1st<op>(op(),a),"\t"),"\n";
}
};

template<class op,int size>
void
x(){
g(size, w<op,size>());
}

int main(){
x<multiplies<int>,6>();
return 0;
}


/*

我们从main看起, main()里只是特殊化了一个x模板函数的对象,
提供的模板参数是multiplies<int>和6

再看x模板函数的内容, g(6, w<multiplies<int>, 6>());
注意w是个模板类, 重载了(), 所以是一个函数对象类.
w<multiplies<int>, 6>()生成了一个匿名函数对象, 我们叫他
anony, 传给了 g(). 在g()里六次调用:
anony(i), i = 0..5;
这个调用被展开:
g(6, binder1st<multiplies<int> >(multiplies<int>(), i), "\t"); // *
return "\n";
也就是打印一行的内容;

对于binder1st这个函数对象类, 如果要详细解释的话会很费事,
简而言之, *行等同于:
g(6, bind1st(multiplies<int>, i), "\t");
bind1st生成一个单参函数, 我们假设这个函数叫saf(int a);
则此处其形式为:
int saf(int a) {
// return multiplies(i, a), 也就是
return i * a; // 这里的i就是上面 * 给出的i
}
整体来说, *行通过调用g()打印以"\t"分隔的一排数,
对于给定的i, 这排数是:
i*0 i*1 ... i*5

而刚才说了, anony(i)打印一行, i = 0..5,
所以这个程序实际上是打印乘法表.
0 0 0 0 0 0
0 1 2 3 4 5
0 2 4 6 8 10
0 3 6 9 12 15
0 4 8 12 16 20
0 5 10 15 20 25
*/
...全文
172 3 打赏 收藏 举报
写回复
3 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
myan 2001-02-25
虫虫老弟有所不知,最近我上smiling速度奇慢,10分钟一个页面,
实在受不了。今天上午打算上传The C++ Programming Language,
等了40多分钟,结果是..失败... 这真是...

鸟老弟真厉害,学习C++三个月就有这般功力,真令我辈汗颜!
  • 打赏
  • 举报
回复
babysloth 2001-02-25
怎么不放在smiling却浪费在这里?
  • 打赏
  • 举报
回复
ed9er 2001-02-25
你翻译的真快……,这个比那个绕多了……

废话两句,我是一只小小鸟,不是谦虚,我真正学C++不过三个月,MFC一窍不通,SDK刚开始看,之所以名字叫始祖鸟是因为我名字的首字母缩写是szn,智能ABC里面出来就是上中农和始祖鸟,最近才发现这个名字容易引起误解
  • 打赏
  • 举报
回复
发帖
非技术区

1.5w+

社区成员

C/C++ 非技术区
社区管理员
  • 非技术区社区
加入社区
帖子事件
创建了帖子
2001-02-25 05:47
社区公告
暂无公告