Предположим, у меня есть список параметров шаблона, которые можно увеличить. Я хочу увеличить заголовок этого списка. Вот кодРазрешение перегрузки шаблона Variadic
template<int N>
struct Counter {
static constexpr Counter<N+1> increment();
};
template<int N>
constexpr Counter<N+1> Counter<N>::increment() {
return Counter<N+1>();
}
//List (will be used as List of Counters)
template <typename... TAIL>
struct List {};
template <typename HEAD, typename... TAIL>
struct List<HEAD,TAIL...> {};
template <typename HEAD, typename... TAIL>
auto incrFront() -> decltype(List<decltype(HEAD::increment()),TAIL...>()) {
return List<decltype(HEAD::increment()),TAIL...>();
}
Это действительно работает:
auto l0 = incrFront<Counter<0>>(); // Ok, decltype(l0) == List<Counter<1>>
l0 = List<Counter<1>>(); //Ok, right type
auto l1 = incrFront<Counter<0>,Counter<1>>(); // Ok, decltype(l1) == List<Counter<1>,Counter<1>>
l1 = List<Counter<1>,Counter<1>>();
Теперь я хотел бы, чтобы увеличить заднюю часть списка, так
template <typename... HEAD, typename TAIL>
auto incrBack() -> decltype(List<decltype(HEAD...,TAIL::increment())>()) {
return List<decltype(HEAD...,TAIL::increment()>();
}
Но получил ошибку 'incrBack' не было объявлено в этой области
Я попытался добавить еще один способ до этого:
template <typename... HEAD>
auto incrBack() -> decltype(List<HEAD...>()) {
std::cout << "Should not be here\n";
return List<HEAD...>();
}
Надеясь, что этот метод никогда не вызывается при разрешении перегрузки, но этот метод действительно называется.
Любой ключ? Я просто хочу, чтобы этот пример работает:
auto l2 = incrBack<Counter<1>,Counter<1>>(); // I want decltype(l2) == List<Counter<1>,Counter<2>>
l2 = incrFront<Counter<0>,Counter<2>>(); //should be possible
A VARIADIC пакет ласточки * любые аргументы *, 'TAIL' никогда не будет иметь тип и 'incrBack' удаляется из разрешения перегрузки. – Xeo
Вам понадобится рекурсия, чтобы съесть все аргументы, пока вы не дойдете до последнего и не увеличьте его. – jrok
Действительно ли вы хотите, чтобы 'incrFront' работал? Поскольку нет вычетов и список не инкапсулирован ничем, вы должны вызывать его с явным пакетом параметров каждый раз. Поражение цели, нет? – Potatoswatter