sfinae.cpp 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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.
  5. #include "./test.hpp"
  6. #if defined(BOOST_CONVERT_IS_NOT_SUPPORTED)
  7. int main(int, char const* []) { return 0; }
  8. #else
  9. #include <boost/convert.hpp>
  10. #include <boost/convert/detail/is_string.hpp>
  11. #include <boost/convert/detail/is_callable.hpp>
  12. #include <boost/detail/lightweight_test.hpp>
  13. //[is_callable_declaration
  14. namespace { namespace local
  15. {
  16. BOOST_DECLARE_IS_CALLABLE(can_call_funop, operator());
  17. BOOST_DECLARE_IS_CALLABLE(can_call_func, func);
  18. }}
  19. //]
  20. //[is_callable_classes_tested
  21. namespace { namespace callable
  22. {
  23. struct test1 { int operator()(double, std::string) { return 0; }};
  24. struct test2 { void operator()(double, std::string) {}};
  25. struct test3 { void operator()(int) {}};
  26. struct test4 { std::string operator()(int) const { return std::string(); }};
  27. struct test5 { std::string operator()(int, std::string const& =std::string()) const { return std::string(); }};
  28. struct test6 { template<typename T> std::string operator()(T) const { return std::string(); }};
  29. struct test7 { template<typename T> T operator()(T) const { return T(); }};
  30. struct test11 { int func(double, std::string) { return 0; }};
  31. struct test12 { void func(double, std::string) {}};
  32. struct test13 { void func(int) {}};
  33. struct test14 { std::string func(int) const { return std::string(); }};
  34. struct test15 { std::string func(int, std::string const& =std::string()) const { return std::string(); }};
  35. struct test16 { template<typename T> std::string func(T) const { return std::string(); }};
  36. struct test17 { template<typename T> T func(T) const { return T(); }};
  37. }}
  38. //]
  39. static
  40. void
  41. test_is_callable()
  42. {
  43. // C1. Unfortunately, passing 'double' where 'int' is expected returns 'true'.
  44. // The same as the following (which successfully compiles):
  45. // void fun(int) {}
  46. // fun(double(1));
  47. //[is_callable_usage1
  48. BOOST_TEST((local::can_call_funop<callable::test1, int (double, std::string)>::value == true));
  49. BOOST_TEST((local::can_call_funop<callable::test1, double (int, std::string)>::value == true));
  50. BOOST_TEST((local::can_call_funop<callable::test1, void (double, std::string)>::value == true));
  51. BOOST_TEST((local::can_call_funop<callable::test1, void (int, std::string)>::value == true));
  52. BOOST_TEST((local::can_call_funop<callable::test1, void (int, char const*)>::value == true));
  53. BOOST_TEST((local::can_call_funop<callable::test1, int (double, int)>::value == false));
  54. BOOST_TEST((local::can_call_funop<callable::test1, int (double)>::value == false));
  55. BOOST_TEST((local::can_call_funop<callable::test2, int (double, std::string)>::value == false));
  56. BOOST_TEST((local::can_call_funop<callable::test2, void (double, std::string)>::value == true));
  57. BOOST_TEST((local::can_call_funop<callable::test2, void ( int, std::string)>::value == true));
  58. BOOST_TEST((local::can_call_funop<callable::test2, void ( int, char const*)>::value == true));
  59. //]
  60. BOOST_TEST((local::can_call_funop<callable::test3, void (double)>::value == true)); //C1
  61. BOOST_TEST((local::can_call_funop<callable::test3, void (int)>::value == true));
  62. BOOST_TEST((local::can_call_funop<callable::test3 const, void (int)>::value == false));
  63. BOOST_TEST((local::can_call_funop<callable::test4 const, std::string (int)>::value == true));
  64. BOOST_TEST((local::can_call_funop<callable::test4, std::string (int)>::value == true));
  65. BOOST_TEST((local::can_call_funop<callable::test4 const, void (int)>::value == true));
  66. BOOST_TEST((local::can_call_funop<callable::test4, void (int)>::value == true));
  67. BOOST_TEST((local::can_call_funop<callable::test5, std::string (int, std::string)>::value == true));
  68. BOOST_TEST((local::can_call_funop<callable::test5, std::string (int, std::string const&)>::value == true));
  69. BOOST_TEST((local::can_call_funop<callable::test5, void (int, char const*)>::value == true));
  70. BOOST_TEST((local::can_call_funop<callable::test5, std::string (int)>::value == true));
  71. BOOST_TEST((local::can_call_funop<callable::test5 const, std::string (int)>::value == true));
  72. BOOST_TEST((local::can_call_funop<callable::test5, void (int)>::value == true));
  73. BOOST_TEST((local::can_call_funop<callable::test5 const, void (int)>::value == true));
  74. BOOST_TEST((local::can_call_funop<callable::test5, void (char const*)>::value == false));
  75. BOOST_TEST((local::can_call_funop<callable::test5 const, void (char const*)>::value == false));
  76. BOOST_TEST((local::can_call_funop<callable::test6, std::string (int)>::value == true));
  77. BOOST_TEST((local::can_call_funop<callable::test6, std::string (std::string)>::value == true));
  78. BOOST_TEST((local::can_call_funop<callable::test6, void (int)>::value == true));
  79. BOOST_TEST((local::can_call_funop<callable::test6, void (std::string)>::value == true));
  80. BOOST_TEST((local::can_call_funop<callable::test7, std::string (int)>::value == false));
  81. BOOST_TEST((local::can_call_funop<callable::test7, std::string (std::string)>::value == true));
  82. BOOST_TEST((local::can_call_funop<callable::test7, void (int)>::value == true));
  83. BOOST_TEST((local::can_call_funop<callable::test7, void (std::string)>::value == true));
  84. //[is_callable_usage2
  85. BOOST_TEST((local::can_call_func<callable::test11, int (double, std::string)>::value == true));
  86. BOOST_TEST((local::can_call_func<callable::test11, double (int, std::string)>::value == true));
  87. BOOST_TEST((local::can_call_func<callable::test11, void (double, std::string)>::value == true));
  88. BOOST_TEST((local::can_call_func<callable::test11, void (int, std::string)>::value == true));
  89. BOOST_TEST((local::can_call_func<callable::test11, void (int, char const*)>::value == true));
  90. BOOST_TEST((local::can_call_func<callable::test11, int (double, int)>::value == false));
  91. BOOST_TEST((local::can_call_func<callable::test11, int (double)>::value == false));
  92. BOOST_TEST((local::can_call_func<callable::test12, int (double, std::string)>::value == false));
  93. BOOST_TEST((local::can_call_func<callable::test12, void (double, std::string)>::value == true));
  94. BOOST_TEST((local::can_call_func<callable::test12, void ( int, std::string)>::value == true));
  95. BOOST_TEST((local::can_call_func<callable::test12, void ( int, char const*)>::value == true));
  96. //]
  97. BOOST_TEST((local::can_call_func<callable::test13, void (double)>::value == true)); //C1
  98. BOOST_TEST((local::can_call_func<callable::test13, void (int)>::value == true));
  99. BOOST_TEST((local::can_call_func<callable::test13 const, void (int)>::value == false));
  100. BOOST_TEST((local::can_call_func<callable::test14 const, std::string (int)>::value == true));
  101. BOOST_TEST((local::can_call_func<callable::test14, std::string (int)>::value == true));
  102. BOOST_TEST((local::can_call_func<callable::test14 const, void (int)>::value == true));
  103. BOOST_TEST((local::can_call_func<callable::test14, void (int)>::value == true));
  104. BOOST_TEST((local::can_call_func<callable::test15, std::string (int, std::string)>::value == true));
  105. BOOST_TEST((local::can_call_func<callable::test15, std::string (int, std::string const&)>::value == true));
  106. BOOST_TEST((local::can_call_func<callable::test15, void (int, char const*)>::value == true));
  107. BOOST_TEST((local::can_call_func<callable::test15, std::string (int)>::value == true));
  108. BOOST_TEST((local::can_call_func<callable::test15 const, std::string (int)>::value == true));
  109. BOOST_TEST((local::can_call_func<callable::test15, void (int)>::value == true));
  110. BOOST_TEST((local::can_call_func<callable::test15 const, void (int)>::value == true));
  111. BOOST_TEST((local::can_call_func<callable::test15, void (char const*)>::value == false));
  112. BOOST_TEST((local::can_call_func<callable::test15 const, void (char const*)>::value == false));
  113. BOOST_TEST((local::can_call_func<callable::test16, std::string (int)>::value == true));
  114. BOOST_TEST((local::can_call_func<callable::test16, std::string (std::string)>::value == true));
  115. BOOST_TEST((local::can_call_func<callable::test16, void (int)>::value == true));
  116. BOOST_TEST((local::can_call_func<callable::test16, void (std::string)>::value == true));
  117. BOOST_TEST((local::can_call_func<callable::test17, std::string (int)>::value == false));
  118. BOOST_TEST((local::can_call_func<callable::test17, std::string (std::string)>::value == true));
  119. BOOST_TEST((local::can_call_func<callable::test17, void (int)>::value == true));
  120. BOOST_TEST((local::can_call_func<callable::test17, void (std::string)>::value == true));
  121. }
  122. int
  123. main(int, char const* [])
  124. {
  125. //[is_callable_usage
  126. //]
  127. test_is_callable();
  128. BOOST_TEST(boost::cnv::is_string<direction>::value == false);
  129. BOOST_TEST(boost::cnv::is_string<std::string>::value == true);
  130. BOOST_TEST(boost::cnv::is_string<std::wstring>::value == true);
  131. BOOST_TEST(boost::cnv::is_string<my_string>::value == true);
  132. BOOST_TEST(boost::cnv::is_string<int>::value == false);
  133. return boost::report_errors();
  134. }
  135. #endif