1// Boost.Convert test and usage example
2// Copyright (c) 2009-2020 Vladimir Batov.
3// Use, modification and distribution are subject to the Boost Software License,
4// Version 1.0. See http://www.boost.org/LICENSE_1_0.txt.
5
6#include "./test.hpp"
7
8#if !defined(BOOST_CONVERT_CXX14)
9int main(int, char const* []) { return 0; }
10#else
11
12#include <boost/convert.hpp>
13#include <boost/convert/detail/is_string.hpp>
14#include <boost/convert/detail/is_callable.hpp>
15
16//[is_callable_declaration
17namespace { namespace local
18{
19 BOOST_DECLARE_IS_CALLABLE(can_call_funop, operator());
20 BOOST_DECLARE_IS_CALLABLE(can_call_func, func);
21}}
22//]
23
24//[is_callable_classes_tested
25namespace { namespace callable
26{
27 struct test1 { int operator()(double, std::string) { return 0; }};
28 struct test2 { void operator()(double, std::string) {}};
29 struct test3 { void operator()(int) {}};
30 struct test4 { std::string operator()(int) const { return std::string(); }};
31 struct test5 { std::string operator()(int, std::string const& =std::string()) const { return std::string(); }};
32 struct test6 { template<typename T> std::string operator()(T) const { return std::string(); }};
33 struct test7 { template<typename T> T operator()(T) const { return T(); }};
34
35 struct test11 { int func(double, std::string) { return 0; }};
36 struct test12 { void func(double, std::string) {}};
37 struct test13 { void func(int) {}};
38 struct test14 { std::string func(int) const { return std::string(); }};
39 struct test15 { std::string func(int, std::string const& =std::string()) const { return std::string(); }};
40 struct test16 { template<typename T> std::string func(T) const { return std::string(); }};
41 struct test17 { template<typename T> T func(T) const { return T(); }};
42}}
43//]
44
45static
46void
47test_is_callable()
48{
49 // C1. Unfortunately, passing 'double' where 'int' is expected returns 'true'.
50 // The same as the following (which successfully compiles):
51 // void fun(int) {}
52 // fun(double(1));
53
54 //[is_callable_usage1
55 BOOST_TEST((local::can_call_funop<callable::test1, int (double, std::string)>::value == true));
56 BOOST_TEST((local::can_call_funop<callable::test1, double (int, std::string)>::value == true));
57 BOOST_TEST((local::can_call_funop<callable::test1, void (double, std::string)>::value == true));
58 BOOST_TEST((local::can_call_funop<callable::test1, void (int, std::string)>::value == true));
59 BOOST_TEST((local::can_call_funop<callable::test1, void (int, char const*)>::value == true));
60 BOOST_TEST((local::can_call_funop<callable::test1, int (double, int)>::value == false));
61 BOOST_TEST((local::can_call_funop<callable::test1, int (double)>::value == false));
62
63 BOOST_TEST((local::can_call_funop<callable::test2, int (double, std::string)>::value == false));
64 BOOST_TEST((local::can_call_funop<callable::test2, void (double, std::string)>::value == true));
65 BOOST_TEST((local::can_call_funop<callable::test2, void ( int, std::string)>::value == true));
66 BOOST_TEST((local::can_call_funop<callable::test2, void ( int, char const*)>::value == true));
67 //]
68 BOOST_TEST((local::can_call_funop<callable::test3, void (double)>::value == true)); //C1
69 BOOST_TEST((local::can_call_funop<callable::test3, void (int)>::value == true));
70 BOOST_TEST((local::can_call_funop<callable::test3 const, void (int)>::value == false));
71
72 BOOST_TEST((local::can_call_funop<callable::test4 const, std::string (int)>::value == true));
73 BOOST_TEST((local::can_call_funop<callable::test4, std::string (int)>::value == true));
74 BOOST_TEST((local::can_call_funop<callable::test4 const, void (int)>::value == true));
75 BOOST_TEST((local::can_call_funop<callable::test4, void (int)>::value == true));
76
77 BOOST_TEST((local::can_call_funop<callable::test5, std::string (int, std::string)>::value == true));
78 BOOST_TEST((local::can_call_funop<callable::test5, std::string (int, std::string const&)>::value == true));
79 BOOST_TEST((local::can_call_funop<callable::test5, void (int, char const*)>::value == true));
80 BOOST_TEST((local::can_call_funop<callable::test5, std::string (int)>::value == true));
81 BOOST_TEST((local::can_call_funop<callable::test5 const, std::string (int)>::value == true));
82 BOOST_TEST((local::can_call_funop<callable::test5, void (int)>::value == true));
83 BOOST_TEST((local::can_call_funop<callable::test5 const, void (int)>::value == true));
84 BOOST_TEST((local::can_call_funop<callable::test5, void (char const*)>::value == false));
85 BOOST_TEST((local::can_call_funop<callable::test5 const, void (char const*)>::value == false));
86
87 BOOST_TEST((local::can_call_funop<callable::test6, std::string (int)>::value == true));
88 BOOST_TEST((local::can_call_funop<callable::test6, std::string (std::string)>::value == true));
89 BOOST_TEST((local::can_call_funop<callable::test6, void (int)>::value == true));
90 BOOST_TEST((local::can_call_funop<callable::test6, void (std::string)>::value == true));
91
92 BOOST_TEST((local::can_call_funop<callable::test7, std::string (int)>::value == false));
93 BOOST_TEST((local::can_call_funop<callable::test7, std::string (std::string)>::value == true));
94 BOOST_TEST((local::can_call_funop<callable::test7, void (int)>::value == true));
95 BOOST_TEST((local::can_call_funop<callable::test7, void (std::string)>::value == true));
96
97 //[is_callable_usage2
98 BOOST_TEST((local::can_call_func<callable::test11, int (double, std::string)>::value == true));
99 BOOST_TEST((local::can_call_func<callable::test11, double (int, std::string)>::value == true));
100 BOOST_TEST((local::can_call_func<callable::test11, void (double, std::string)>::value == true));
101 BOOST_TEST((local::can_call_func<callable::test11, void (int, std::string)>::value == true));
102 BOOST_TEST((local::can_call_func<callable::test11, void (int, char const*)>::value == true));
103 BOOST_TEST((local::can_call_func<callable::test11, int (double, int)>::value == false));
104 BOOST_TEST((local::can_call_func<callable::test11, int (double)>::value == false));
105
106 BOOST_TEST((local::can_call_func<callable::test12, int (double, std::string)>::value == false));
107 BOOST_TEST((local::can_call_func<callable::test12, void (double, std::string)>::value == true));
108 BOOST_TEST((local::can_call_func<callable::test12, void ( int, std::string)>::value == true));
109 BOOST_TEST((local::can_call_func<callable::test12, void ( int, char const*)>::value == true));
110 //]
111 BOOST_TEST((local::can_call_func<callable::test13, void (double)>::value == true)); //C1
112 BOOST_TEST((local::can_call_func<callable::test13, void (int)>::value == true));
113 BOOST_TEST((local::can_call_func<callable::test13 const, void (int)>::value == false));
114
115 BOOST_TEST((local::can_call_func<callable::test14 const, std::string (int)>::value == true));
116 BOOST_TEST((local::can_call_func<callable::test14, std::string (int)>::value == true));
117 BOOST_TEST((local::can_call_func<callable::test14 const, void (int)>::value == true));
118 BOOST_TEST((local::can_call_func<callable::test14, void (int)>::value == true));
119
120 BOOST_TEST((local::can_call_func<callable::test15, std::string (int, std::string)>::value == true));
121 BOOST_TEST((local::can_call_func<callable::test15, std::string (int, std::string const&)>::value == true));
122 BOOST_TEST((local::can_call_func<callable::test15, void (int, char const*)>::value == true));
123 BOOST_TEST((local::can_call_func<callable::test15, std::string (int)>::value == true));
124 BOOST_TEST((local::can_call_func<callable::test15 const, std::string (int)>::value == true));
125 BOOST_TEST((local::can_call_func<callable::test15, void (int)>::value == true));
126 BOOST_TEST((local::can_call_func<callable::test15 const, void (int)>::value == true));
127 BOOST_TEST((local::can_call_func<callable::test15, void (char const*)>::value == false));
128 BOOST_TEST((local::can_call_func<callable::test15 const, void (char const*)>::value == false));
129
130 BOOST_TEST((local::can_call_func<callable::test16, std::string (int)>::value == true));
131 BOOST_TEST((local::can_call_func<callable::test16, std::string (std::string)>::value == true));
132 BOOST_TEST((local::can_call_func<callable::test16, void (int)>::value == true));
133 BOOST_TEST((local::can_call_func<callable::test16, void (std::string)>::value == true));
134
135 BOOST_TEST((local::can_call_func<callable::test17, std::string (int)>::value == false));
136 BOOST_TEST((local::can_call_func<callable::test17, std::string (std::string)>::value == true));
137 BOOST_TEST((local::can_call_func<callable::test17, void (int)>::value == true));
138 BOOST_TEST((local::can_call_func<callable::test17, void (std::string)>::value == true));
139}
140
141int
142main(int, char const* [])
143{
144 //[is_callable_usage
145 //]
146
147 test_is_callable();
148
149 BOOST_TEST(boost::cnv::is_string<direction>::value == false);
150 BOOST_TEST(boost::cnv::is_string<std::string>::value == true);
151 BOOST_TEST(boost::cnv::is_string<std::wstring>::value == true);
152 BOOST_TEST(boost::cnv::is_string<my_string>::value == true);
153 BOOST_TEST(boost::cnv::is_string<int>::value == false);
154
155 return boost::report_errors();
156}
157
158#endif
159

source code of boost/libs/convert/test/sfinae.cpp