cradle::lambda::functor

Author: Cryolite
Contact: cryolite dot indigo atmark gmail dot com
Date: Nov. 30, 2006
Copyright: Copyright Cryolite 2006. 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)

Abstract

既存の関数オブジェクトに対して,簡易な記法で関数引数の部分評価や 関数合成を行えるようにするアダプタを提供する.


Motivation

(needs to be documented)

Synopsis

namespace cradle{ namespace lambda{

template<
    class AdaptableFunction
  , class UnlambdaOption = boost::mpl::list0<>
  >
class functor
  : public cradle::lambda::enable_sig // exposition only
{
public:
  typedef AdaptableFunction functor_type;

  functor();

  explicit functor( AdaptableFunction f );

  functor( functor const &rhs );

  template< /* unspecified template parameters */ >
  struct result;

  template< /* unspecified template parameters */ >
  /* unspecified return type */
  operator()( /* unspecified parameters */ );

  template< /* unspecified template parameters */ >
  /* unspecified return type */
  operator()( /* unspecified parameters */ );

  template< /* unspecified template parameters */ >
  /* unspecified return type */
  operator()( /* unspecified parameters */ ) const;

private:
  functor_type f_; // exposition only
}; // class functor

}} // namespace cradle::lambda

Template Parameters

Requirements on Template Parameters

  • Requirements on AdaptableFunction

    • AdaptableFunction は Copy Constructible コンセプトの モデルでなければならない
    • AdaptableFunction は Adaptable Function コンセプトの モデルでなければならない
  • Requirements on UnlambdaOption

    (needs to be documented)

    • UnlambdaOption は Front Extensible Sequence のモデルでなければならない

Model of

Types

Valid Expressions

以下では,次のような表記を用いる.


F f;

Compile-time precondition:
 F は Default Constructible コンセプトの モデルでなければならない.
Effect:f_ をデフォルトコンストラクタで初期化した オブジェクトを生成する.
Where defined:Default Constructible

F();

Compile-time precondition:
 F は Default Constructible コンセプトの モデルでなければならない.
Effect:f_ をデフォルトコンストラクタで初期化した オブジェクトを生成する.
Where defined:Default Constructible

F( x );

Effect:f_x で初期化したオブジェクトを生成する.

F f( x );

Effect:f_x で初期化したオブジェクトを生成する.

F( g );

Where defined:Copy Constructible

F f( g );

Where defined:Copy Constructible

f( unspecified-arguments )

Effect:0引数から5引数までの関数呼び出し構文をサポートする. unlambda 項として指定された位置・名前のパラメタ以外の 全ての引数が Lambda Functor でないならば,与えられた引数による 関数呼び出しを完全に f_ に転送し,戻り値があればそれを返す. それ以外の場合,与えられた Lambda Functor に基づいて 部分引数束縛・関数合成を行った Lambda Functor を返す.
Return type:unlambda 項として指定された位置・名前のパラメタ以外の 全ての引数が Lambda Functor でないならば,それらの引数による f_ の関数呼び出し構文の戻り値型となる. それ以外の場合の呼び出しに関しては unspecified である.

(needs to be documented)

Examples

その1

int f( int x, int y )
{ return x + y; }

int main()
{
  using namespace boost::lambda;

  std::vector< int > v;
  v.push_back( 1 );
  v.push_back( 2 );
  v.push_back( 3 );
  cradle::lambda::functor< int (*)( int, int ) > plus( &f );
  int sum = std::accumulate( v.begin(), v.end(), plus( _1, _2 ) );
  std::cout << sum << std::endl; // outputs "6"
  return EXIT_SUCCESS;
}

その2

struct plus_
  : public cradle::lambda::enable_sig
{
  template< class FArgs >
  struct result;

  template< class F, class L, class R >
  struct result< F( L, R ) >
    : public cradle::remove_rcv< L >
  {};

  template< class L, class R >
  L operator()( L const &l, R const &r ) const
  { return l + r; };
};

int main()
{
  using namespace boost::lambda;

  cradle::lambda::functor< plus_ > plus;

  std::vector< int > v;
  v.push_back( 1 );
  v.push_back( 2 );
  v.push_back( 3 );
  int sum = std::accumulate( v.begin(), v.end(), plus( _1, _2 ) );
  std::cout << sum << std::endl; // outputs "6"

  std::transform( v.begin(), v.end(), v.begin(), plus( _1, 40 ) );
  std::cout << v[1] << std::endl; // outputs "42"

  std::vector< std::string > u;
  u.push_back( "Hello," );
  u.push_back( " world" );
  u.push_back( "!" );
  std::string msg = std::accumulate( u.begin(), u.end(), plus( _1, _2 ) );
  std::cout << msg << std::endl; // outputs "Hello, world!"

  return EXIT_SUCCESS;
}