首页 > 其他 > 详细

Tomcat 8(六)catalina.bat详解

时间:2014-04-02 07:47:05      阅读:507      评论:0      收藏:0      [点我收藏+]

英文原文:How the Boost Bind Library Can Improve Your C++ Programs


翻译:Bind底层机制概览

你开始使用Boost.Bind之后禁不住就会问,它到底是如何工作的呢?看起来,bind自动推算参数类型和返回值是很神奇的,另外,到底是怎么处理占位符的呢?我们先简单地了解一下驱动bind这个“怪兽”的底层机制。这会对我们理解bind如何工作有一定帮助,尤其是当我们试图解析编译器由于极微小的差池而发出的非常简洁又直接的错误信息(especially when trying to decipher the wonderfully succinct and direct error messages the compiler emits at the slightest mistake.)我们会创建一个模仿着Boost.Bind写的绑定器。为了避免在本文做过长的讨论,我们的示例只支持一种绑定方法——绑定只含一个参数的类成员函数。另外,我们也不会过多讨论处理cv资格极其家族的细节问题(Moreover, we won‘t even get bogged down with the details of how to handle cv-qualification and its ilk。一切保持简单。

首先,我们需要能推导出绑定函数的返回类型,类类型以及参数类型。我们使用模板函数来完成这个工作。
template <typename R, typename T, typename Arg>
simple_bind_t<R,T,Arg> simple_bind(
	R (T::*fn)(Arg),
	const T& t,
	const placeholder&) {
		return simple_bind_t<R,T,Arg>(fn,t);
}

上述的代码看起来可能难以理解,那是因为我们目前只定义了套件的一部分。在这个部分我们需要关注的是类型推导是在哪里起作用的。这个函数共有三个模板参数,R,T,Arg。R是返回类型,T是类类型,Arg是参数类型(单个)。这些模板参数组成了我们函数的第一个参数——R (T::*f)(Arg)。因此,将单参数的成员函数传递给simple_bind使得编译器能够推导出R作为函数返回值。T是成员函数所属的类,Arg是成员函数的参数。simple_bind的返回值是一个在与simple_bind同类型上参数化的函数对象,它的构造体接收一个指向成员函数的指针以及一个类T的实例。simple_bind简单地忽略占位符(最后一个参数),代码中加入的原因只是为了模仿Boost.Bind的语法。显然我们如果能利用好这个占位符参数,是bind思路的更好实现,但现在我们暂时不考虑它。函数对象的实现非常直接:

template <typename R,typename T, typename Arg>
class simple_bind_t {
	typedef R (T::*fn)(Arg);
	fn fn_;
	T t_;
public:
	simple_bind_t(fn f,const T& t):fn_(f),t_(t) {}

	R operator()(Arg& a) {
		return (t_.*fn_)(a);
	}
};

像我们实现simple_bind一样,构造函数接收2个参数:第一个是指向成员函数的指针,第二个是const T的引用,之后会被复制,用于调用含用户参数的函数。最后,函数调用器返回R(成员函数的返回类型),并接收一个Arg参数(成员函数的参数类型)。有点儿隐式的调用成员函数的方式是:(t_.*fn_)(a);。“.*”是“指向成员”操作符,在第一个操作数是T类时使用,相应的,操作数是指向T类指针时,用“->*”。剩下的工作就是创建占位符,即一个代替实参的变量。我们可以使用包含某种类型变量的匿名命名空间来创建这种占位符,姑且把它称为placeholder:

namespace {
	class placeholder {};
	placeholder _1;
}

我们写了一个小巧简单的程序来完成测试:

class Test {
public:
	void do_stuff(const std::vector<int>& v) {
		std::copy(v.begin(),v.end(),
			std::ostream_iterator<int>(std::cout," "));
	}
};

int main() {
	Test t;
	std::vector<int> vec;
	vec.push_back(42);
	simple_bind(&Test::do_stuff,t,_1)(vec);
}

当我们用上述参数实例化sinple_bind函数时,类型都被自动推演出来;R是void,T是Test,Arg是const std::vector<int>的引用。在我们通过传入vec参数立即调用函数调用器后,返回simple_bind_t<void,Test,Arg>的实例。

希望simple_bind可以给予你一些关于绑定器如何工作的启发。

原创:编程实验

#include <vector>
#include <algorithm>
#include <iterator>
#include <iostream>

namespace {
	class placeholder {};
	placeholder _1;
}

template <typename R,typename T, typename Arg>
class simple_bind_t {
	typedef R (T::*fn)(Arg);
	fn fn_;
	T t_;
public:
	simple_bind_t(fn f,const T& t):fn_(f),t_(t) {}

	R operator()(Arg& a) {
		return (t_.*fn_)(a);
	}
};

template <typename R, typename T, typename Arg>
simple_bind_t<R,T,Arg> simple_bind(
	R (T::*fn)(Arg),
	const T& t,
	const placeholder&) {
		return simple_bind_t<R,T,Arg>(fn,t);
}

class Test {
public:
	void do_stuff(const std::vector<int>& v) {
		std::copy(v.begin(),v.end(),
			std::ostream_iterator<int>(std::cout," "));
	}
};

int main() {
	Test t;
	std::vector<int> vec;
	vec.push_back(42);
	simple_bind(&Test::do_stuff,t,_1)(vec);
}


Tomcat 8(六)catalina.bat详解,布布扣,bubuko.com

Tomcat 8(六)catalina.bat详解

原文:http://blog.csdn.net/flyliuweisky547/article/details/22753383

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!