Mercurial > hg > CbC > CbC_gcc
view gcc/testsuite/g++.dg/cpp0x/variadic-lambda.C @ 131:84e7813d76e9
gcc-8.2
author | mir3636 |
---|---|
date | Thu, 25 Oct 2018 07:37:49 +0900 |
parents | 04ced10e8804 |
children |
line wrap: on
line source
// { dg-do compile { target c++11 } } struct int_placeholder; template<typename T> struct do_replace { typedef T type; }; template<> struct do_replace<int_placeholder> { typedef int type; }; template<typename T> struct lambdalike { typedef T type; }; template<template<typename...> class TT, typename... Args> struct lambdalike<TT<Args...> > { typedef TT<typename do_replace<Args>::type...> type; }; template<typename T, typename U> struct is_same { static const bool value = false; }; template<typename T> struct is_same<T, T> { static const bool value = true; }; template<typename... Elements> struct tuple; template<typename T1, typename T2> struct pair; static_assert(is_same<lambdalike<tuple<float, int_placeholder, double>>::type, tuple<float, int, double>>::value, "MPL lambda-like replacement on tuple"); static_assert(is_same<lambdalike<pair<float, int_placeholder>>::type, pair<float, int>>::value, "MPL lambda-like replacement on pair"); struct _1 {}; template<typename Arg0, typename Lambda> struct eval { typedef Lambda type; }; template<typename Arg0> struct eval<Arg0, _1> { typedef Arg0 type; }; template<typename Arg0, template<typename...> class T, typename... Pack> struct eval<Arg0, T<Pack...> > { typedef T< typename eval<Arg0, Pack>::type... > type; }; static_assert(is_same<eval<int, tuple<float, _1, double>>::type, tuple<float, int, double>>::value, "eval tuple"); static_assert(is_same<eval<int, pair<_1, double>>::type, pair<int, double>>::value, "eval pair"); static_assert(is_same<eval<int, tuple<pair<_1, _1>, pair<float, float>, pair<double, _1>>>::type, tuple<pair<int, int>, pair<float, float>, pair<double, int>>>::value, "recursive eval");