view gcc/testsuite/g++.dg/concepts/template-template-parm1.C @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
line wrap: on
line source

// PR c++/66937
// { dg-do compile { target c++17_only } }
// { 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
}