x
Yes
No
Do you want to visit DriveHQ English website?
首页
产品服务
价格
免费试用
下载客户端
关于我们
云文件服务
|
云备份服务
|
FTP服务
|
企业邮箱服务
|
网站托管
|
客户端软件
云文件服务
云备份服务
FTP服务
企业级邮箱服务
网站托管
客户端软件
functions.hpp - Hosted on DriveHQ Cloud IT Platform
返回上层目录
上传
下载
共享
发布
新建文件夹
新建文件
复制
剪切
删除
粘贴
评论
升级服务
路径: \\game3dprogramming\materials\GameFactory\GameFactoryDemo\references\boost_1_35_0\boost\spirit\phoenix\functions.hpp
旋转
特效
属性
历史版本
/*============================================================================= Phoenix V1.2.1 Copyright (c) 2001-2002 Joel de Guzman Use, modification and distribution is subject to 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) ==============================================================================*/ #ifndef PHOENIX_FUNCTIONS_HPP #define PHOENIX_FUNCTIONS_HPP /////////////////////////////////////////////////////////////////////////////// #include
#include
/////////////////////////////////////////////////////////////////////////////// namespace phoenix { /////////////////////////////////////////////////////////////////////////////// // // function class // // Lazy functions // // This class provides a mechanism for lazily evaluating functions. // Syntactically, a lazy function looks like an ordinary C/C++ // function. The function call looks the same. However, unlike // ordinary functions, the actual function execution is deferred. // (see actor.hpp, primitives.hpp and composite.hpp for an // overview). For example here are sample factorial function calls: // // factorial(4) // factorial(arg1) // factorial(arg1 * 6) // // These functions are automatically lazily bound unlike ordinary // function pointers or functor objects that need to be explicitly // bound through the bind function (see binders.hpp). // // A lazy function works in conjunction with a user defined functor // (as usual with a member operator()). Only special forms of // functor objects are allowed. This is required to enable true // polymorphism (STL style monomorphic functors and function // pointers can still be used through the bind facility in // binders.hpp). // // This special functor is expected to have a nested template class // result
(where N is the number of arguments of its // member operator()). The nested template class result should have // a typedef 'type' that reflects the return type of its member // operator(). This is essentially a type computer that answers the // metaprogramming question "Given arguments of type A...TN, what // will be the operator()'s return type?". // // There is a special case for functors that accept no arguments. // Such nullary functors are only required to define a typedef // result_type that reflects the return type of its operator(). // // Here's an example of a simple functor that computes the // factorial of a number: // // struct factorial_impl { // // template
// struct result { typedef Arg type; }; // // template
// Arg operator()(Arg n) const // { return (n <= 0) ? 1 : n * this->operator()(n-1); } // }; // // As can be seen, the functor can be polymorphic. Its arguments // and return type are not fixed to a particular type. The example // above for example, can handle any type as long as it can carry // out the required operations (i.e. <=, * and -). // // We can now declare and instantiate a lazy 'factorial' function: // // function
factorial; // // Invoking a lazy function 'factorial' does not immediately // execute the functor factorial_impl. Instead, a composite (see // composite.hpp) object is created and returned to the caller. // Example: // // factorial(arg1) // // does nothing more than return a composite. A second function // call will invoke the actual factorial function. Example: // // int i = 4; // cout << factorial(arg1)(i); // // will print out "24". // // Take note that in certain cases (e.g. for functors with state), // an instance may be passed on to the constructor. Example: // // function
factorial(ftor); // // where ftor is an instance of factorial_impl (this is not // necessary in this case since factorial is a simple stateless // functor). Take care though when using functors with state // because the functors are taken in by value. It is best to keep // the data manipulated by a functor outside the functor itself and // keep a reference to this data inside the functor. Also, it is // best to keep functors as small as possible. // /////////////////////////////////////////////////////////////////////////////// template
struct function { function() : op() {} function(OperationT const& op_) : op(op_) {} actor
> operator()() const; template
typename impl::make_composite
::type operator()(A const& a) const; template
typename impl::make_composite
::type operator()(A const& a, B const& b) const; template
typename impl::make_composite
::type operator()(A const& a, B const& b, C const& c) const; #if PHOENIX_LIMIT > 3 template
typename impl::make_composite
::type operator()(A const& a, B const& b, C const& c, D const& d) const; template
typename impl::make_composite< OperationT, A, B, C, D, E >::type operator()( A const& a, B const& b, C const& c, D const& d, E const& e ) const; template < typename A, typename B, typename C, typename D, typename E, typename F > typename impl::make_composite< OperationT, A, B, C, D, E, F >::type operator()( A const& a, B const& b, C const& c, D const& d, E const& e, F const& f ) const; #if PHOENIX_LIMIT > 6 template < typename A, typename B, typename C, typename D, typename E, typename F, typename G > typename impl::make_composite< OperationT, A, B, C, D, E, F, G >::type operator()( A const& a, B const& b, C const& c, D const& d, E const& e, F const& f, G const& g ) const; template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H > typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H >::type operator()( A const& a, B const& b, C const& c, D const& d, E const& e, F const& f, G const& g, H const& h ) const; template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I > typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I >::type operator()( A const& a, B const& b, C const& c, D const& d, E const& e, F const& f, G const& g, H const& h, I const& i ) const; #if PHOENIX_LIMIT > 9 template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J > typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I, J >::type operator()( A const& a, B const& b, C const& c, D const& d, E const& e, F const& f, G const& g, H const& h, I const& i, J const& j ) const; template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K > typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I, J, K >::type operator()( A const& a, B const& b, C const& c, D const& d, E const& e, F const& f, G const& g, H const& h, I const& i, J const& j, K const& k ) const; template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K, typename L > typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I, J, K, L >::type operator()( A const& a, B const& b, C const& c, D const& d, E const& e, F const& f, G const& g, H const& h, I const& i, J const& j, K const& k, L const& l ) const; #if PHOENIX_LIMIT > 12 template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K, typename L, typename M > typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M >::type operator()( A const& a, B const& b, C const& c, D const& d, E const& e, F const& f, G const& g, H const& h, I const& i, J const& j, K const& k, L const& l, M const& m ) const; template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K, typename L, typename M, typename N > typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M, N >::type operator()( A const& a, B const& b, C const& c, D const& d, E const& e, F const& f, G const& g, H const& h, I const& i, J const& j, K const& k, L const& l, M const& m, N const& n ) const; template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K, typename L, typename M, typename N, typename O > typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O >::type operator()( A const& a, B const& b, C const& c, D const& d, E const& e, F const& f, G const& g, H const& h, I const& i, J const& j, K const& k, L const& l, M const& m, N const& n, O const& o ) const; #endif #endif #endif #endif OperationT op; }; /////////////////////////////////////////////////////////////////////////////// // // function class implementation // /////////////////////////////////////////////////////////////////////////////// template
inline actor
> function
::operator()() const { return actor
>(op); } ////////////////////////////////// template
template
inline typename impl::make_composite
::type function
::operator()(A const& a) const { typedef typename impl::make_composite
::composite_type ret_t; return ret_t ( op, as_actor
::convert(a) ); } ////////////////////////////////// template
template
inline typename impl::make_composite
::type function
::operator()(A const& a, B const& b) const { typedef typename impl::make_composite
::composite_type ret_t; return ret_t( op, as_actor
::convert(a), as_actor
::convert(b) ); } ////////////////////////////////// template
template
inline typename impl::make_composite
::type function
::operator()(A const& a, B const& b, C const& c) const { typedef typename impl::make_composite
::composite_type ret_t; return ret_t( op, as_actor
::convert(a), as_actor
::convert(b), as_actor
::convert(c) ); } #if PHOENIX_LIMIT > 3 ////////////////////////////////// template
template < typename A, typename B, typename C, typename D > inline typename impl::make_composite< OperationT, A, B, C, D >::type function
::operator()( A const& a, B const& b, C const& c, D const& d ) const { typedef typename impl::make_composite< OperationT, A, B, C, D >::composite_type ret_t; return ret_t( op, as_actor
::convert(a), as_actor
::convert(b), as_actor
::convert(c), as_actor
::convert(d) ); } ////////////////////////////////// template
template < typename A, typename B, typename C, typename D, typename E > inline typename impl::make_composite< OperationT, A, B, C, D, E >::type function
::operator()( A const& a, B const& b, C const& c, D const& d, E const& e ) const { typedef typename impl::make_composite< OperationT, A, B, C, D, E >::composite_type ret_t; return ret_t( op, as_actor
::convert(a), as_actor
::convert(b), as_actor
::convert(c), as_actor
::convert(d), as_actor
::convert(e) ); } ////////////////////////////////// template
template < typename A, typename B, typename C, typename D, typename E, typename F > inline typename impl::make_composite< OperationT, A, B, C, D, E, F >::type function
::operator()( A const& a, B const& b, C const& c, D const& d, E const& e, F const& f ) const { typedef typename impl::make_composite< OperationT, A, B, C, D, E, F >::composite_type ret_t; return ret_t( op, as_actor
::convert(a), as_actor
::convert(b), as_actor
::convert(c), as_actor
::convert(d), as_actor
::convert(e), as_actor
::convert(f) ); } #if PHOENIX_LIMIT > 6 ////////////////////////////////// template
template < typename A, typename B, typename C, typename D, typename E, typename F, typename G > inline typename impl::make_composite< OperationT, A, B, C, D, E, F, G >::type function
::operator()( A const& a, B const& b, C const& c, D const& d, E const& e, F const& f, G const& g ) const { typedef typename impl::make_composite< OperationT, A, B, C, D, E, F, G >::composite_type ret_t; return ret_t( op, as_actor
::convert(a), as_actor
::convert(b), as_actor
::convert(c), as_actor
::convert(d), as_actor
::convert(e), as_actor
::convert(f), as_actor
::convert(g) ); } ////////////////////////////////// template
template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H > inline typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H >::type function
::operator()( A const& a, B const& b, C const& c, D const& d, E const& e, F const& f, G const& g, H const& h ) const { typedef typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H >::composite_type ret_t; return ret_t( op, as_actor
::convert(a), as_actor
::convert(b), as_actor
::convert(c), as_actor
::convert(d), as_actor
::convert(e), as_actor
::convert(f), as_actor
::convert(g), as_actor
::convert(h) ); } ////////////////////////////////// template
template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I > inline typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I >::type function
::operator()( A const& a, B const& b, C const& c, D const& d, E const& e, F const& f, G const& g, H const& h, I const& i ) const { typedef typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I >::composite_type ret_t; return ret_t( op, as_actor
::convert(a), as_actor
::convert(b), as_actor
::convert(c), as_actor
::convert(d), as_actor
::convert(e), as_actor
::convert(f), as_actor
::convert(g), as_actor
::convert(h), as_actor
::convert(i) ); } #if PHOENIX_LIMIT > 9 ////////////////////////////////// template
template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J > inline typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I, J >::type function
::operator()( A const& a, B const& b, C const& c, D const& d, E const& e, F const& f, G const& g, H const& h, I const& i, J const& j ) const { typedef typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I, J >::composite_type ret_t; return ret_t( op, as_actor
::convert(a), as_actor
::convert(b), as_actor
::convert(c), as_actor
::convert(d), as_actor
::convert(e), as_actor
::convert(f), as_actor
::convert(g), as_actor
::convert(h), as_actor
::convert(i), as_actor
::convert(j) ); } ////////////////////////////////// template
template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K > inline typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I, J, K >::type function
::operator()( A const& a, B const& b, C const& c, D const& d, E const& e, F const& f, G const& g, H const& h, I const& i, J const& j, K const& k ) const { typedef typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I, J, K >::composite_type ret_t; return ret_t( op, as_actor
::convert(a), as_actor
::convert(b), as_actor
::convert(c), as_actor
::convert(d), as_actor
::convert(e), as_actor
::convert(f), as_actor
::convert(g), as_actor
::convert(h), as_actor
::convert(i), as_actor
::convert(j), as_actor
::convert(k) ); } ////////////////////////////////// template
template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K, typename L > inline typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I, J, K, L >::type function
::operator()( A const& a, B const& b, C const& c, D const& d, E const& e, F const& f, G const& g, H const& h, I const& i, J const& j, K const& k, L const& l ) const { typedef typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I, J, K, L >::composite_type ret_t; return ret_t( op, as_actor
::convert(a), as_actor
::convert(b), as_actor
::convert(c), as_actor
::convert(d), as_actor
::convert(e), as_actor
::convert(f), as_actor
::convert(g), as_actor
::convert(h), as_actor
::convert(i), as_actor
::convert(j), as_actor
::convert(k), as_actor
::convert(l) ); } #if PHOENIX_LIMIT > 12 ////////////////////////////////// template
template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K, typename L, typename M > inline typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M >::type function
::operator()( A const& a, B const& b, C const& c, D const& d, E const& e, F const& f, G const& g, H const& h, I const& i, J const& j, K const& k, L const& l, M const& m ) const { typedef typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M >::composite_type ret_t; return ret_t( op, as_actor
::convert(a), as_actor
::convert(b), as_actor
::convert(c), as_actor
::convert(d), as_actor
::convert(e), as_actor
::convert(f), as_actor
::convert(g), as_actor
::convert(h), as_actor
::convert(i), as_actor
::convert(j), as_actor
::convert(k), as_actor
::convert(l), as_actor
::convert(m) ); } ////////////////////////////////// template
template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K, typename L, typename M, typename N > inline typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M, N >::type function
::operator()( A const& a, B const& b, C const& c, D const& d, E const& e, F const& f, G const& g, H const& h, I const& i, J const& j, K const& k, L const& l, M const& m, N const& n ) const { typedef typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M, N >::composite_type ret_t; return ret_t( op, as_actor
::convert(a), as_actor
::convert(b), as_actor
::convert(c), as_actor
::convert(d), as_actor
::convert(e), as_actor
::convert(f), as_actor
::convert(g), as_actor
::convert(h), as_actor
::convert(i), as_actor
::convert(j), as_actor
::convert(k), as_actor
::convert(l), as_actor
::convert(m), as_actor
::convert(n) ); } ////////////////////////////////// template
template < typename A, typename B, typename C, typename D, typename E, typename F, typename G, typename H, typename I, typename J, typename K, typename L, typename M, typename N, typename O > inline typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O >::type function
::operator()( A const& a, B const& b, C const& c, D const& d, E const& e, F const& f, G const& g, H const& h, I const& i, J const& j, K const& k, L const& l, M const& m, N const& n, O const& o ) const { typedef typename impl::make_composite< OperationT, A, B, C, D, E, F, G, H, I, J, K, L, M, N, O >::composite_type ret_t; return ret_t( op, as_actor
::convert(a), as_actor
::convert(b), as_actor
::convert(c), as_actor
::convert(d), as_actor
::convert(e), as_actor
::convert(f), as_actor
::convert(g), as_actor
::convert(h), as_actor
::convert(i), as_actor
::convert(j), as_actor
::convert(k), as_actor
::convert(l), as_actor
::convert(m), as_actor
::convert(n), as_actor
::convert(o) ); } #endif #endif #endif #endif /////////////////////////////////////////////////////////////////////////////// } // namespace phoenix #endif
functions.hpp
网页地址
文件地址
上一页
6/13
下一页
下载
( 23 KB )
Comments
Total ratings:
0
Average rating:
无评论
of 10
Would you like to comment?
Join now
, or
Logon
if you are already a member.