一个更有趣的Obfuscated C++程序
#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
*/
#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
*/
...全文
相关推荐
C++编程惯用法——高级程序员常用方法和技巧.pdf
他还是《The C++ Report》杂志的创立编辑,并主持了著名的Obfuscated C++专栏。
Xcode 4.3过审 工程混淆方案--OLLVM编译
此方法特别适用于iOS 4.3版本的应用程序开发,可以帮助开发者有效地保护自己的知识产权。
Dezender5 DezendMe Commandline Decoder
Be sure you have the Visual C++ 2008 and 2010 installed on your system. If not please run "runtim
au3反编译源码
au3反编译源码myAut2Exe - The Open Source AutoIT Script Decompiler 2.9====================================
CISP-CSE注册云安全工程师备考资源包基础教程
随着云计算技术的普及,云安全已成为网络安全领域的核心议题。CISP-CSE(注册云安全工程师)认证由中国信息安全测评中心颁发,旨在培养具备云安全专业知识和实践能力的实战型人才。本教程将结合"CISP-CSE注册云安全工程师备考资源包",系统性地为您梳理云安全的核心知识体系,并提供实战案例分析,助您高效备考。


非技术区
