一个更有趣的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
*/