casts.hpp
来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 220 行
HPP
220 行
// - casts.hpp -- BLambda Library -------------//// Copyright (C) 2000 Gary Powell (powellg@amazon.com)// Copyright (C) 1999, 2000 Jaakko J鋜vi (jaakko.jarvi@cs.utu.fi)//// Distributed under the Boost Software License, Version 1.0. (See// accompanying file LICENSE_1_0.txt or copy at// http://www.boost.org/LICENSE_1_0.txt)//// For more information, see http://www.boost.org// -----------------------------------------------#if !defined(BOOST_LAMBDA_CASTS_HPP)#define BOOST_LAMBDA_CASTS_HPP#include <typeinfo>namespace boost { namespace lambda {template<class T> class cast_action;template<class T> class static_cast_action;template<class T> class dynamic_cast_action;template<class T> class const_cast_action;template<class T> class reinterpret_cast_action;class typeid_action;class sizeof_action;// Cast actionstemplate<class T> class cast_action<static_cast_action<T> > {public: template<class RET, class Arg1> static RET apply(Arg1 &a1) { return static_cast<RET>(a1); }};template<class T> class cast_action<dynamic_cast_action<T> > {public: template<class RET, class Arg1> static RET apply(Arg1 &a1) { return dynamic_cast<RET>(a1); }};template<class T> class cast_action<const_cast_action<T> > {public: template<class RET, class Arg1> static RET apply(Arg1 &a1) { return const_cast<RET>(a1); }};template<class T> class cast_action<reinterpret_cast_action<T> > {public: template<class RET, class Arg1> static RET apply(Arg1 &a1) { return reinterpret_cast<RET>(a1); }}; // typedid actionclass typeid_action {public: template<class RET, class Arg1> static RET apply(Arg1 &a1) { return typeid(a1); }};// sizeof actionclass sizeof_action{public: template<class RET, class Arg1> static RET apply(Arg1 &a1) { return sizeof(a1); }};// return types of casting lambda_functors (all "T" type.)template<template <class> class cast_type, class T, class A>struct return_type_N<cast_action< cast_type<T> >, A> { typedef T type;};// return type of typeid_actiontemplate<class A>struct return_type_N<typeid_action, A> { typedef std::type_info const & type;};// return type of sizeof_actiontemplate<class A>struct return_type_N<sizeof_action, A> { typedef std::size_t type;};// the four cast & typeid overloads.// casts can take ordinary variables (not just lambda functors)// static_cast template <class T, class Arg1>inline const lambda_functor< lambda_functor_base< action<1, cast_action<static_cast_action<T> > >, tuple<typename const_copy_argument <const Arg1>::type> > >ll_static_cast(const Arg1& a1) { return lambda_functor_base< action<1, cast_action<static_cast_action<T> > >, tuple<typename const_copy_argument <const Arg1>::type> > ( tuple<typename const_copy_argument <const Arg1>::type>(a1));}// dynamic_casttemplate <class T, class Arg1>inline const lambda_functor< lambda_functor_base< action<1, cast_action<dynamic_cast_action<T> > >, tuple<typename const_copy_argument <const Arg1>::type> > >ll_dynamic_cast(const Arg1& a1) { return lambda_functor_base< action<1, cast_action<dynamic_cast_action<T> > >, tuple<typename const_copy_argument <const Arg1>::type> > ( tuple<typename const_copy_argument <const Arg1>::type>(a1));}// const_casttemplate <class T, class Arg1>inline const lambda_functor< lambda_functor_base< action<1, cast_action<const_cast_action<T> > >, tuple<typename const_copy_argument <const Arg1>::type> > >ll_const_cast(const Arg1& a1) { return lambda_functor_base< action<1, cast_action<const_cast_action<T> > >, tuple<typename const_copy_argument <const Arg1>::type> > ( tuple<typename const_copy_argument <const Arg1>::type>(a1));}// reinterpret_casttemplate <class T, class Arg1>inline const lambda_functor< lambda_functor_base< action<1, cast_action<reinterpret_cast_action<T> > >, tuple<typename const_copy_argument <const Arg1>::type> > >ll_reinterpret_cast(const Arg1& a1) { return lambda_functor_base< action<1, cast_action<reinterpret_cast_action<T> > >, tuple<typename const_copy_argument <const Arg1>::type> > ( tuple<typename const_copy_argument <const Arg1>::type>(a1));}// typeid// can be applied to a normal variable as well (can refer to a polymorphic// class object)template <class Arg1>inline const lambda_functor< lambda_functor_base< action<1, typeid_action>, tuple<typename const_copy_argument <const Arg1>::type> > >ll_typeid(const Arg1& a1) { return lambda_functor_base< action<1, typeid_action>, tuple<typename const_copy_argument <const Arg1>::type> > ( tuple<typename const_copy_argument <const Arg1>::type>(a1));}// sizeof(expression)// Always takes a lambda expression (if not, built in sizeof will do)template <class Arg1>inline const lambda_functor< lambda_functor_base< action<1, sizeof_action>, tuple<lambda_functor<Arg1> > > >ll_sizeof(const lambda_functor<Arg1>& a1) { return lambda_functor_base< action<1, sizeof_action>, tuple<lambda_functor<Arg1> > > ( tuple<lambda_functor<Arg1> >(a1));}} // namespace lambda } // namespace boost#endif
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?