Overview
Description
This is a simple, but functional, C++14 lambda library. It takes
advantage of the fact that the standard <functional> header already
provides placeholders _1, _2, _3, and so on, for use with
std::bind, and function objects such as std::plus, std::greater,
std::logical_not, and std::bit_xor, corresponding to arithmetic,
relational, logical and bitwise operators.
This allows the library to provide a minimal implementation that
still lets expressions such as _1 + 5, _1 % 2 == 0, _1 > _2,
or _1 == ' ' || _1 == '\t' to be composed and used as function
objects.
These "lambda" expressions can also be freely combined with std::bind.
For example, std::bind( f, _1 ) == std::bind( g, _1 ) and
std::bind( f, _1 + _2 ) both work and have the expected behavior.
Usage Examples
Counting the Even Numbers
#include <boost/lambda2.hpp>
#include <algorithm>
using namespace boost::lambda2;
int count_even( int const * first, int const * last )
{
return std::count_if( first, last, _1 % 2 == 0 );
}
Finding the First Whitespace Character
#include <boost/lambda2.hpp>
#include <algorithm>
char const * find_whitespace( char const * first, char const * last )
{
using namespace boost::lambda2;
return std::find_if( first, last,
_1 == ' ' || _1 == '\t' || _1 == '\r' || _1 == '\n' );
}
Dependencies
None. A single, self-contained header.
Reference
<boost/lambda2/lambda2.hpp>
Synopsis
namespace boost {
namespace lambda2 {
template<class A, class B> auto operator+( A && a, B && b );
template<class A, class B> auto operator-( A && a, B && b );
template<class A, class B> auto operator*( A && a, B && b );
template<class A, class B> auto operator/( A && a, B && b );
template<class A, class B> auto operator%( A && a, B && b );
template<class A> auto operator-( A && a );
template<class A, class B> auto operator==( A && a, B && b );
template<class A, class B> auto operator!=( A && a, B && b );
template<class A, class B> auto operator>( A && a, B && b );
template<class A, class B> auto operator<( A && a, B && b );
template<class A, class B> auto operator>=( A && a, B && b );
template<class A, class B> auto operator<=( A && a, B && b );
template<class A, class B> auto operator&&( A && a, B && b );
template<class A, class B> auto operator||( A && a, B && b );
template<class A> auto operator!( A && a );
template<class A, class B> auto operator&( A && a, B && b );
template<class A, class B> auto operator|( A && a, B && b );
template<class A, class B> auto operator^( A && a, B && b );
template<class A> auto operator~( A && a );
} // namespace lambda2
} // namespace boost
Common Requirements
All operators defined in the subsequent sections only participate in
overload resolution if at least one of their operands is such that for
its unqualified type T, the expression
std::is_placeholder<T>::value || std::is_bind_expression<T>::value
is true.
Arithmetic Operators
template<class A, class B> auto operator+( A && a, B && b );
-
- Returns:
-
std::bind( std::plus<>(), std::forward<A>(a), std::forward<B>(b) );
template<class A, class B> auto operator-( A && a, B && b );
-
- Returns:
-
std::bind( std::minus<>(), std::forward<A>(a), std::forward<B>(b) );
template<class A, class B> auto operator*( A && a, B && b );
-
- Returns:
-
std::bind( std::multiplies<>(), std::forward<A>(a), std::forward<B>(b) );
template<class A, class B> auto operator/( A && a, B && b );
-
- Returns:
-
std::bind( std::divides<>(), std::forward<A>(a), std::forward<B>(b) );
template<class A, class B> auto operator%( A && a, B && b );
-
- Returns:
-
std::bind( std::modulus<>(), std::forward<A>(a), std::forward<B>(b) );
template<class A> auto operator-( A && a );
-
- Returns:
-
std::bind( std::negate<>(), std::forward<A>(a) );
Relational Operators
template<class A, class B> auto operator==( A && a, B && b );
-
- Returns:
-
std::bind( std::equal_to<>(), std::forward<A>(a), std::forward<B>(b) );
template<class A, class B> auto operator!=( A && a, B && b );
-
- Returns:
-
std::bind( std::not_equal_to<>(), std::forward<A>(a), std::forward<B>(b) );
template<class A, class B> auto operator>( A && a, B && b );
-
- Returns:
-
std::bind( std::greater<>(), std::forward<A>(a), std::forward<B>(b) );
template<class A, class B> auto operator<( A && a, B && b );
-
- Returns:
-
std::bind( std::less<>(), std::forward<A>(a), std::forward<B>(b) );
template<class A, class B> auto operator>=( A && a, B && b );
-
- Returns:
-
std::bind( std::greater_equal<>(), std::forward<A>(a), std::forward<B>(b) );
template<class A, class B> auto operator<=( A && a, B && b );
-
- Returns:
-
std::bind( std::less_equal<>(), std::forward<A>(a), std::forward<B>(b) );
Logical Operators
template<class A, class B> auto operator&&( A && a, B && b );
-
- Returns:
-
std::bind( std::logical_and<>(), std::forward<A>(a), std::forward<B>(b) );
template<class A, class B> auto operator||( A && a, B && b );
-
- Returns:
-
std::bind( std::logical_or<>(), std::forward<A>(a), std::forward<B>(b) );
template<class A> auto operator!( A && a );
-
- Returns:
-
std::bind( std::logical_not<>(), std::forward<A>(a) );
Bitwise Operators
template<class A, class B> auto operator&( A && a, B && b );
-
- Returns:
-
std::bind( std::bit_and<>(), std::forward<A>(a), std::forward<B>(b) );
template<class A, class B> auto operator|( A && a, B && b );
-
- Returns:
-
std::bind( std::bit_or<>(), std::forward<A>(a), std::forward<B>(b) );
template<class A, class B> auto operator^( A && a, B && b );
-
- Returns:
-
std::bind( std::bit_xor<>(), std::forward<A>(a), std::forward<B>(b) );
template<class A> auto operator~( A && a );
-
- Returns:
-
std::bind( std::bit_not<>(), std::forward<A>(a) );
Copyright and License
This documentation is copyright 2020 Peter Dimov and is distributed under the Boost Software License, Version 1.0.