]>
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-2016 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>
15 #include <boost/detail/lightweight_test.hpp>
17 //[is_callable_declaration
18 namespace { namespace local
20 BOOST_DECLARE_IS_CALLABLE(can_call_funop
, operator());
21 BOOST_DECLARE_IS_CALLABLE(can_call_func
, func
);
25 //[is_callable_classes_tested
26 namespace { namespace callable
28 struct test1
{ int operator()(double, std::string
) { return 0; }};
29 struct test2
{ void operator()(double, std::string
) {}};
30 struct test3
{ void operator()(int) {}};
31 struct test4
{ std::string
operator()(int) const { return std::string(); }};
32 struct test5
{ std::string
operator()(int, std::string
const& =std::string()) const { return std::string(); }};
33 struct test6
{ template<typename T
> std::string
operator()(T
) const { return std::string(); }};
34 struct test7
{ template<typename T
> T
operator()(T
) const { return T(); }};
36 struct test11
{ int func(double, std::string
) { return 0; }};
37 struct test12
{ void func(double, std::string
) {}};
38 struct test13
{ void func(int) {}};
39 struct test14
{ std::string
func(int) const { return std::string(); }};
40 struct test15
{ std::string
func(int, std::string
const& =std::string()) const { return std::string(); }};
41 struct test16
{ template<typename T
> std::string
func(T
) const { return std::string(); }};
42 struct test17
{ template<typename T
> T
func(T
) const { return T(); }};
50 // C1. Unfortunately, passing 'double' where 'int' is expected returns 'true'.
51 // The same as the following (which successfully compiles):
56 BOOST_TEST((local::can_call_funop
<callable::test1
, int (double, std::string
)>::value
== true));
57 BOOST_TEST((local::can_call_funop
<callable::test1
, double (int, std::string
)>::value
== true));
58 BOOST_TEST((local::can_call_funop
<callable::test1
, void (double, std::string
)>::value
== true));
59 BOOST_TEST((local::can_call_funop
<callable::test1
, void (int, std::string
)>::value
== true));
60 BOOST_TEST((local::can_call_funop
<callable::test1
, void (int, char const*)>::value
== true));
61 BOOST_TEST((local::can_call_funop
<callable::test1
, int (double, int)>::value
== false));
62 BOOST_TEST((local::can_call_funop
<callable::test1
, int (double)>::value
== false));
64 BOOST_TEST((local::can_call_funop
<callable::test2
, int (double, std::string
)>::value
== false));
65 BOOST_TEST((local::can_call_funop
<callable::test2
, void (double, std::string
)>::value
== true));
66 BOOST_TEST((local::can_call_funop
<callable::test2
, void ( int, std::string
)>::value
== true));
67 BOOST_TEST((local::can_call_funop
<callable::test2
, void ( int, char const*)>::value
== true));
69 BOOST_TEST((local::can_call_funop
<callable::test3
, void (double)>::value
== true)); //C1
70 BOOST_TEST((local::can_call_funop
<callable::test3
, void (int)>::value
== true));
71 BOOST_TEST((local::can_call_funop
<callable::test3
const, void (int)>::value
== false));
73 BOOST_TEST((local::can_call_funop
<callable::test4
const, std::string (int)>::value
== true));
74 BOOST_TEST((local::can_call_funop
<callable::test4
, std::string (int)>::value
== true));
75 BOOST_TEST((local::can_call_funop
<callable::test4
const, void (int)>::value
== true));
76 BOOST_TEST((local::can_call_funop
<callable::test4
, void (int)>::value
== true));
78 BOOST_TEST((local::can_call_funop
<callable::test5
, std::string (int, std::string
)>::value
== true));
79 BOOST_TEST((local::can_call_funop
<callable::test5
, std::string (int, std::string
const&)>::value
== true));
80 BOOST_TEST((local::can_call_funop
<callable::test5
, void (int, char const*)>::value
== true));
81 BOOST_TEST((local::can_call_funop
<callable::test5
, std::string (int)>::value
== true));
82 BOOST_TEST((local::can_call_funop
<callable::test5
const, std::string (int)>::value
== true));
83 BOOST_TEST((local::can_call_funop
<callable::test5
, void (int)>::value
== true));
84 BOOST_TEST((local::can_call_funop
<callable::test5
const, void (int)>::value
== true));
85 BOOST_TEST((local::can_call_funop
<callable::test5
, void (char const*)>::value
== false));
86 BOOST_TEST((local::can_call_funop
<callable::test5
const, void (char const*)>::value
== false));
88 BOOST_TEST((local::can_call_funop
<callable::test6
, std::string (int)>::value
== true));
89 BOOST_TEST((local::can_call_funop
<callable::test6
, std::string (std::string
)>::value
== true));
90 BOOST_TEST((local::can_call_funop
<callable::test6
, void (int)>::value
== true));
91 BOOST_TEST((local::can_call_funop
<callable::test6
, void (std::string
)>::value
== true));
93 BOOST_TEST((local::can_call_funop
<callable::test7
, std::string (int)>::value
== false));
94 BOOST_TEST((local::can_call_funop
<callable::test7
, std::string (std::string
)>::value
== true));
95 BOOST_TEST((local::can_call_funop
<callable::test7
, void (int)>::value
== true));
96 BOOST_TEST((local::can_call_funop
<callable::test7
, void (std::string
)>::value
== true));
99 BOOST_TEST((local::can_call_func
<callable::test11
, int (double, std::string
)>::value
== true));
100 BOOST_TEST((local::can_call_func
<callable::test11
, double (int, std::string
)>::value
== true));
101 BOOST_TEST((local::can_call_func
<callable::test11
, void (double, std::string
)>::value
== true));
102 BOOST_TEST((local::can_call_func
<callable::test11
, void (int, std::string
)>::value
== true));
103 BOOST_TEST((local::can_call_func
<callable::test11
, void (int, char const*)>::value
== true));
104 BOOST_TEST((local::can_call_func
<callable::test11
, int (double, int)>::value
== false));
105 BOOST_TEST((local::can_call_func
<callable::test11
, int (double)>::value
== false));
107 BOOST_TEST((local::can_call_func
<callable::test12
, int (double, std::string
)>::value
== false));
108 BOOST_TEST((local::can_call_func
<callable::test12
, void (double, std::string
)>::value
== true));
109 BOOST_TEST((local::can_call_func
<callable::test12
, void ( int, std::string
)>::value
== true));
110 BOOST_TEST((local::can_call_func
<callable::test12
, void ( int, char const*)>::value
== true));
112 BOOST_TEST((local::can_call_func
<callable::test13
, void (double)>::value
== true)); //C1
113 BOOST_TEST((local::can_call_func
<callable::test13
, void (int)>::value
== true));
114 BOOST_TEST((local::can_call_func
<callable::test13
const, void (int)>::value
== false));
116 BOOST_TEST((local::can_call_func
<callable::test14
const, std::string (int)>::value
== true));
117 BOOST_TEST((local::can_call_func
<callable::test14
, std::string (int)>::value
== true));
118 BOOST_TEST((local::can_call_func
<callable::test14
const, void (int)>::value
== true));
119 BOOST_TEST((local::can_call_func
<callable::test14
, void (int)>::value
== true));
121 BOOST_TEST((local::can_call_func
<callable::test15
, std::string (int, std::string
)>::value
== true));
122 BOOST_TEST((local::can_call_func
<callable::test15
, std::string (int, std::string
const&)>::value
== true));
123 BOOST_TEST((local::can_call_func
<callable::test15
, void (int, char const*)>::value
== true));
124 BOOST_TEST((local::can_call_func
<callable::test15
, std::string (int)>::value
== true));
125 BOOST_TEST((local::can_call_func
<callable::test15
const, std::string (int)>::value
== true));
126 BOOST_TEST((local::can_call_func
<callable::test15
, void (int)>::value
== true));
127 BOOST_TEST((local::can_call_func
<callable::test15
const, void (int)>::value
== true));
128 BOOST_TEST((local::can_call_func
<callable::test15
, void (char const*)>::value
== false));
129 BOOST_TEST((local::can_call_func
<callable::test15
const, void (char const*)>::value
== false));
131 BOOST_TEST((local::can_call_func
<callable::test16
, std::string (int)>::value
== true));
132 BOOST_TEST((local::can_call_func
<callable::test16
, std::string (std::string
)>::value
== true));
133 BOOST_TEST((local::can_call_func
<callable::test16
, void (int)>::value
== true));
134 BOOST_TEST((local::can_call_func
<callable::test16
, void (std::string
)>::value
== true));
136 BOOST_TEST((local::can_call_func
<callable::test17
, std::string (int)>::value
== false));
137 BOOST_TEST((local::can_call_func
<callable::test17
, std::string (std::string
)>::value
== true));
138 BOOST_TEST((local::can_call_func
<callable::test17
, void (int)>::value
== true));
139 BOOST_TEST((local::can_call_func
<callable::test17
, void (std::string
)>::value
== true));
143 main(int, char const* [])
150 BOOST_TEST(boost::cnv::is_string
<direction
>::value
== false);
151 BOOST_TEST(boost::cnv::is_string
<std::string
>::value
== true);
152 BOOST_TEST(boost::cnv::is_string
<std::wstring
>::value
== true);
153 BOOST_TEST(boost::cnv::is_string
<my_string
>::value
== true);
154 BOOST_TEST(boost::cnv::is_string
<int>::value
== false);
156 return boost::report_errors();