[PATCH] D7573: [libc++] Fix PR20084 - std::is_function<void() const> failed.

Eric Niebler via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Tue Apr 11 15:18:25 PDT 2017


eric_niebler added a comment.

I just ran into this problem while trying to get range-v3 working on clang-3.6. This `is_function` implementation //probably// instantiates fewer templates than the version currently shipping with libc++. Disclaimer: I haven't tested it exhaustively yet.

  template<int I>
  struct priority_tag
      : priority_tag<I - 1>
  {};
  
  template<>
  struct priority_tag<0>
  {};
  
  // Function types here:
  template<typename T>
  char (&is_function_impl_(priority_tag<0>))[1];
  
  // Array types here:
  template<typename T, typename = decltype((*(T*)0)[0])>
  char (&is_function_impl_(priority_tag<1>))[2];
  
  // Anything that can be returned from a function here (including
  // void and reference types):
  template<typename T, typename = T(*)()>
  char (&is_function_impl_(priority_tag<2>))[3];
  
  // Classes and unions (including abstract types) here:
  template<typename T, typename = int T::*>
  char (&is_function_impl_(priority_tag<3>))[4];
  
  template <typename T>
  struct is_function
      : integral_constant<bool, sizeof(is_function_impl_<T>(priority_tag<3>{})) == 1>
  {};




https://reviews.llvm.org/D7573





More information about the cfe-commits mailing list