读书人

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

发布时间: 2012-02-08 19:52:21 作者: rapoo

求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,这个也不是很绕吧?呵呵

读书人网 >C++

热点推荐