...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
Copyright © 2011, 2012 Lorenzo Caminiti
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)
Table of Contents
This library allows to overload different functions into a single function object.
Consider the following functions which have distinct signatures:
const std::string& identity_s(const std::string& x) // Function (as pointer). { return x; } int identity_i_impl(int x) { return x; } int (&identity_i)(int) = identity_i_impl; // Function reference. double identity_d_impl(double x) { return x; } boost::function<double (double)> identity_d = identity_d_impl; // Functor.
Instead of calling them using their separate names (here BOOST_TEST
is equivalent to assert
):
[1]
BOOST_TEST(identity_s("abc") == "abc"); BOOST_TEST(identity_i(123) == 123); BOOST_TEST(identity_d(1.23) == 1.23);
It is possible to use this library to create a single overloaded
function object (or functor)
named identity
that aggregates
together the calls to the specific functions (see also functor.cpp
and identity.hpp
):
boost::overloaded_function< const std::string& (const std::string&) , int (int) , double (double) > identity(identity_s, identity_i, identity_d); // All calls via single `identity` function. BOOST_TEST(identity("abc") == "abc"); BOOST_TEST(identity(123) == 123); BOOST_TEST(identity(1.23) == 1.23);
Note how the functions are called via a single overloaded function object
identity
instead of using their
different names identity_s
,
identity_i
, and identity_d
.
[1]
In most of the examples presented in this documentation, the Boost.Core/LightweightTest
(boost/core/lightweight_test.hpp
) macro BOOST_TEST
is used to check correctness
conditions (conceptually similar to assert
).
A failure of the checked condition does not abort the execution of the program,
it will instead make boost::report_errors
return a non-zero program exit code. Using Boost.Core/LightweightTest allows
to add the examples to the library regression tests so to make sure that
they always compile and run correctly.