• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <boost/config.hpp>
2 
3 #if defined(BOOST_MSVC)
4 #pragma warning(disable: 4786)  // identifier truncated in debug info
5 #pragma warning(disable: 4710)  // function not inlined
6 #pragma warning(disable: 4711)  // function selected for automatic inline expansion
7 #pragma warning(disable: 4514)  // unreferenced inline removed
8 #endif
9 
10 //
11 //  bind_as_compose.cpp - function composition using bind.hpp
12 //
13 //  Version 1.00.0001 (2001-08-30)
14 //
15 //  Copyright (c) 2001 Peter Dimov and Multi Media Ltd.
16 //
17 // Distributed under the Boost Software License, Version 1.0. (See
18 // accompanying file LICENSE_1_0.txt or copy at
19 // http://www.boost.org/LICENSE_1_0.txt)
20 //
21 
22 #include <boost/bind/bind.hpp>
23 #include <iostream>
24 #include <string>
25 
26 using namespace boost::placeholders;
27 
f(std::string const & x)28 std::string f(std::string const & x)
29 {
30     return "f(" + x + ")";
31 }
32 
g(std::string const & x)33 std::string g(std::string const & x)
34 {
35     return "g(" + x + ")";
36 }
37 
h(std::string const & x,std::string const & y)38 std::string h(std::string const & x, std::string const & y)
39 {
40     return "h(" + x + ", " + y + ")";
41 }
42 
k()43 std::string k()
44 {
45     return "k()";
46 }
47 
test(F f)48 template<class F> void test(F f)
49 {
50     std::cout << f("x", "y") << '\n';
51 }
52 
main()53 int main()
54 {
55     using namespace boost;
56 
57     // compose_f_gx
58 
59     test( bind(f, bind(g, _1)) );
60 
61     // compose_f_hxy
62 
63     test( bind(f, bind(h, _1, _2)) );
64 
65     // compose_h_fx_gx
66 
67     test( bind(h, bind(f, _1), bind(g, _1)) );
68 
69     // compose_h_fx_gy
70 
71     test( bind(h, bind(f, _1), bind(g, _2)) );
72 
73     // compose_f_k
74 
75     test( bind(f, bind(k)) );
76 
77     return 0;
78 }
79