Blame view

3rdparty/boost_1_81_0/libs/convert/test/callable.cpp 3.02 KB
977ed18d   Hu Chunming   提交三方库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
  // Boost.Convert test and usage example
  // Copyright (c) 2009-2020 Vladimir Batov.
  // Use, modification and distribution are subject to the Boost Software License,
  // Version 1.0. See http://www.boost.org/LICENSE_1_0.txt.
  
  #include "./test.hpp"
  
  #if !defined(BOOST_CONVERT_CXX14)
  int main(int, char const* []) { return 0; }
  #else
  
  #include <boost/convert.hpp>
  #include <boost/convert/lexical_cast.hpp>
  #include <functional>
  
  using std::string;
  using boost::convert;
  using boost::lexical_cast;
  
  //[callable_example1
  void plain_old_func(string const& value_in, boost::optional<int>& value_out)
  //]
  {
      try
      {
          value_out = lexical_cast<int>(value_in);
      }
      catch (...)
      {
      }
  }
  
  template<typename TypeIn, typename TypeOut>
  void
  convert_all(TypeIn const&, boost::optional<TypeOut>&)
  {
  }
  
  template<typename Type>
  void
  assign(boost::optional<Type>& value_out, Type const& value_in)
  {
      value_out = value_in;
  }
  
  struct converter1
  {
      template<typename TypeIn, typename TypeOut>
      void
      operator()(TypeIn const&, boost::optional<TypeOut>&) const
      {
      }
  };
  
  //[callable_example4
  struct take_double { void operator()(double, boost::optional<string>&) const {}};
  struct    take_int { void operator()(int, boost::optional<string>&) const {}};
  //]
  
  //[callable_example6
  struct double_only
  {
      // Declared for all types.
      template<typename TypeIn> void operator()(TypeIn, boost::optional<string>&) const;
  };
  
  // Defined only for certain types.
  template<> void double_only::operator()<double>(double, boost::optional<string>&) const {}
  //]
  
  int
  main(int, char const* [])
  {
      using func_type = std::function<void (string const& value_in, boost::optional<int>&)>;
  
      char const* const str = "-12";
  
      // Testing old-function-based converter.
      //[callable_example2
      int v01 = convert<int>(str, plain_old_func).value_or(-1);
      //]
      // Testing std::function-based converter.
      int v02 = convert<int>(str, func_type(plain_old_func)).value_or(-1);
      // Testing crazy std::bind-based converter.
      //[callable_example3
      int v03 = convert<int>(str,
                    std::bind(assign<int>, std::placeholders::_2,
                        std::bind(boost::lexical_cast<int, string>, std::placeholders::_1))).value_or(-1);
      //]
      BOOST_TEST(v01 == -12);
      BOOST_TEST(v02 == -12);
      BOOST_TEST(v03 == -12);
  
      convert<int>(str, convert_all<string, int>);
      convert<string>(11, convert_all<int, string>);
      convert<   int>(str,   converter1());
      convert<string>(11,    converter1());
      convert<string>(11.23, take_double());
      convert<string>(11,    take_int());
      //[callable_example5
      convert<string>(11, take_double()); // Compiler applies int-to-double promotion to call the converter.
      convert<string>(11.23, take_int()); // Compiler applies double-to-int implicit truncation.
      //]
      //[callable_example7
      convert<string>(11.23, double_only()); // Fine.
  //  convert<string>(11,    double_only()); // Fails: undefined reference to double_only::operator()<int>
      //]
  
      return boost::report_errors();
  }
  
  #endif