enable_if.hpp 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // Copyright David Abrahams 2004. Distributed under the Boost
  2. // Software License, Version 1.0. (See accompanying
  3. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  4. #ifndef ENABLE_IF_DWA2004722_HPP
  5. # define ENABLE_IF_DWA2004722_HPP
  6. # include <boost/python/detail/sfinae.hpp>
  7. # include <boost/detail/workaround.hpp>
  8. # if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
  9. # include <boost/mpl/if.hpp>
  10. namespace boost { namespace python { namespace detail {
  11. template <class T> struct always_void { typedef void type; };
  12. template <class C, class T = int>
  13. struct enable_if_arg
  14. {
  15. typedef typename mpl::if_<C,T,int&>::type type;
  16. };
  17. template <class C, class T = int>
  18. struct disable_if_arg
  19. {
  20. typedef typename mpl::if_<C,int&,T>::type type;
  21. };
  22. template <class C, class T = typename always_void<C>::type>
  23. struct enable_if_ret
  24. {
  25. typedef typename mpl::if_<C,T,int[2]>::type type;
  26. };
  27. template <class C, class T = typename always_void<C>::type>
  28. struct disable_if_ret
  29. {
  30. typedef typename mpl::if_<C,int[2],T>::type type;
  31. };
  32. }}} // namespace boost::python::detail
  33. # elif !defined(BOOST_NO_SFINAE)
  34. # include <boost/utility/enable_if.hpp>
  35. namespace boost { namespace python { namespace detail {
  36. template <class C, class T = int>
  37. struct enable_if_arg
  38. : enable_if<C,T>
  39. {};
  40. template <class C, class T = int>
  41. struct disable_if_arg
  42. : disable_if<C,T>
  43. {};
  44. template <class C, class T = void>
  45. struct enable_if_ret
  46. : enable_if<C,T>
  47. {};
  48. template <class C, class T = void>
  49. struct disable_if_ret
  50. : disable_if<C,T>
  51. {};
  52. }}} // namespace boost::python::detail
  53. # endif
  54. #endif // ENABLE_IF_DWA2004722_HPP