首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

求C++~一断相当迷惑的代码

2012-02-08 
求C++高手指点~~~一断相当迷惑的代码#include cassert#include cstdlib#include functional#include

求C++高手指点~~~一断相当迷惑的代码
#include <cassert>
#include <cstdlib>
#include <functional>
#include <iostream>
#include <string>
using namespace std;

template<typename R, typename E, typename F1, typename F2>
class unary_composer {
F1 f1;
F2 f2;
public:
unary_composer(F1 fone, F2 ftwo) : f1(fone), f2(ftwo) {}
R operator()(E x) { return f1(f2(x));}
};

template<typename R, typename E, typename F1, typename F2>
unary_composer<R, E, F1, F2> compose(F1 f1,F2 f2) {
return unary_composer<R, E, F1, F2>(f1, f2);
}

int main(){
double x = compose<double, const string&>(
atof, mem_fun_ref(&string::c_str))("12.34");
assert(x==12.34);
}

这断程序是如何知道R 和 E的类型的?

[解决办法]
晕倒,被绕进去了

compose <double, const string&>
就是指定R 和 E的
[解决办法]
double x = compose <double, const string&>(atof, mem_fun_ref(&string::c_str))("12.34"); 

R double 返回值double x
E const string& 传入的参数"12.34"
F1 atof
F2 mem_fun_ref(&string::c_str)

double x = atof(string("12.34").c_str());

[解决办法]

C/C++ code
 
template <typename R, typename E, typename F1, typename F2>
class unary_composer
{
[color=#FF0000]F1 f1;[/color] // 这两个必须是函数对象/指针
[color=#FF0000]F2 f2;[/color]
public:
unary_composer(F1 fone, F2 ftwo) : f1(fone), f2(ftwo) {} // 这个是构造函数,初始化两个函数对象/指针
R operator()(E x) { return f1(f2(x));} // ()运算符重载,参数类型是E返回类型是R
};

// 以下代码定义模板函数返回类型是unary_composer <R, E, F1, F2>
template <typename R, typename E, typename F1, typename F2>
unary_composer <R, E, F1, F2>
[color=#3366FF]compose[/color](F1 f1,F2 f2)// 这个函数的参数也必须是两个函数对象/指针
{
// 这里实例化了类模板unary_composer,并定义了一个类型为unary_composer <R, E, F1, F2>的临时对象
// 然后调用了其()操作符
return unary_composer <R, E, F1, F2>(f1, f2);
}

int main(){
double x =
// 下面调用compose函数
compose <double, const string&>// 这里显式指定了模板函数的模板参数R和E
(atof, mem_fun_ref(&string::c_str))// 这里隐式指定了模板函数的模板参数F1和F2
// 下面用compose的返回值,一个类型为unary_composer <double,const string&,typeof(atof),...>的
// 这么一个临时对象,调用其()运算符,参数类型是E,也就是cosnt string&
("12.34"); // 实参是"12.34",于是前面的f1(f2(x)),
      // 也就是atof(mem_fun_ref(&string::c_str)(12.34))返回了一个double值12.34
assert(x==12.34);
}

mem_fun_ref我没用过,但它应该包含一个()运算符重载
lz,这个也不是很绕吧?呵呵

热点排行