view gcc/testsuite/g++.dg/cpp1y/lambda-generic-variadic17.C @ 131:84e7813d76e9

gcc-8.2
author mir3636
date Thu, 25 Oct 2018 07:37:49 +0900
parents
children
line wrap: on
line source

// PR c++/85118
// { dg-do compile { target c++14 } }

namespace std
{
  template<typename _Tp>
    struct remove_const
    { typedef _Tp type; };

  template<typename _Tp>
    struct remove_const<_Tp const>
    { typedef _Tp type; };


  template<typename _Tp>
    struct remove_volatile
    { typedef _Tp type; };

  template<typename _Tp>
    struct remove_volatile<_Tp volatile>
    { typedef _Tp type; };


  template<typename _Tp>
    struct remove_cv
    {
      typedef typename
      remove_const<typename remove_volatile<_Tp>::type>::type type;
    };

  template<typename _Tp>
    struct remove_reference
    { typedef _Tp type; };

  template<typename _Tp>
    struct remove_reference<_Tp&>
    { typedef _Tp type; };

  template<typename _Tp>
    struct remove_reference<_Tp&&>
    { typedef _Tp type; };

  template<typename _Tp>
    struct decay
    {
      using type = typename remove_reference<typename remove_const<_Tp>::type>::type;
    };

  template<typename _Tp>
    _Tp&&
    declval() noexcept;

  template<typename _Tp>
    constexpr _Tp&&
    forward(typename std::remove_reference<_Tp>::type& __t) noexcept
    { return static_cast<_Tp&&>(__t); }


  template<typename _Arg>
    struct _Mu
    {
      template<typename _CVArg, typename _Tuple>
         _CVArg&&
         operator()(_CVArg&& __arg, _Tuple&) const volatile
         { return std::forward<_CVArg>(__arg); }
    };

   template<typename _Functor, typename _Bound_args>
    struct _Bind
    {
      _Functor _M_f;
      _Bound_args _M_bound_args;

      template<typename _Args, typename _Result
         = decltype( std::declval<_Functor&>()(
               _Mu<_Bound_args>()( std::declval<_Bound_args&>(),
              std::declval<_Args&>() ) ) )>
         _Result
      operator()(_Args&& __args) { return {}; }

      template<typename _Args, typename _Result
         = decltype( std::declval<volatile _Functor&>()(
               _Mu<_Bound_args>()( std::declval<volatile _Bound_args&>(),
              std::declval<_Args&>() ) ) )>
         _Result
         operator()(_Args&& __args) volatile;

    };

  template<typename _Func, typename _BoundArgs>
    _Bind<typename decay<_Func>::type, typename decay<_BoundArgs>::type>
    bind(_Func&& __f, _BoundArgs&& __args)
    {
      return {
        std::forward<_Func>(__f),
          std::forward<_BoundArgs>(__args)
      };
    }

} // namespace std


template <typename T>
bool isOneOf(const T& )
{
    return false;
}

template <typename T, typename FirstType, typename... Tail>
bool isOneOf(const T& t, const FirstType& firstValue, const Tail&... tail)
{
    return t == firstValue || isOneOf(t, tail...);
}

int main()
{
    const auto isOneOfHelper = [](auto&&... params)
    {
      return isOneOf(std::forward<decltype(params)>(params)...);
    };

    auto isO = std::bind(isOneOfHelper, 'o');

    isO('o');
}