]>
git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/convert/test/sfinae.cpp
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.
8 #if defined(BOOST_CONVERT_IS_NOT_SUPPORTED)
9 int main(int, char const* []) { return 0; }
12 #include <boost/convert.hpp>
13 #include <boost/convert/detail/is_string.hpp>
14 #include <boost/convert/detail/is_callable.hpp>
16 //[is_callable_declaration
17 namespace { namespace local
19 BOOST_DECLARE_IS_CALLABLE(can_call_funop
, operator());
20 BOOST_DECLARE_IS_CALLABLE(can_call_func
, func
);
24 //[is_callable_classes_tested
25 namespace { namespace callable
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(); }};
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(); }};
49 // C1. Unfortunately, passing 'double' where 'int' is expected returns 'true'.
50 // The same as the following (which successfully compiles):
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
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));
142 main(int, char const* [])
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);
155 return boost::report_errors();