view gcc/testsuite/g++.dg/concepts/template-template-parm1.C @ 131:84e7813d76e9

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

// PR c++/66937
// { dg-do compile { target c++17 } }
// { dg-options "-fconcepts" }

#include <tuple>

namespace detail
{
  template<typename T, template<typename...> class Sink>
  struct copy_tuple_args_impl;

  template<typename... Args, template<typename...> class Sink>
  struct copy_tuple_args_impl<std::tuple<Args...>, Sink>
  {
    using type = Sink<Args...>;
  };
}

// copy_tuple_args copies the template arguments of a tuple into another template
// copy_tuple_args does not care about constraints whatsoever.
template<typename Tuple, template<typename...> class Sink>
using copy_tuple_args = typename detail::copy_tuple_args_impl<Tuple, Sink>::type;

// A concept of a column
template <typename T>
concept bool Column()
{
  return requires()
    {
      typename T::_name_t;
    };
}

// column_list is constrained to Column arguments
template<Column... C>
struct column_list
{
};

// Here are some columns
struct A
{
  using _name_t = int;
};

struct B
{
  using _name_t = int;
};


int main()
{
  using ColumnTuple = std::tuple<A, B>;
  using ColumnList = copy_tuple_args<ColumnTuple, column_list>; // This fails, but should not
}