@Morpheyka

Variadic template c++?

#include <iostream>
using namespace std;

//от сюда
template <bool a> int reversed_binary_value() { 
    return a;
}

template <bool a, bool b, bool... d> int reversed_binary_value() {
  return (reversed_binary_value<b, d...>() << 1) + a;
}
//до сюда

template <int n, bool...digits>
struct CheckValues {
  	static void check(int x, int y)
  	{
    	CheckValues<n-1, 0, digits...>::check(x, y);
    	CheckValues<n-1, 1, digits...>::check(x, y);
  	}
};

template <bool...digits>
struct CheckValues<0, digits...> {
  	static void check(int x, int y)
  	{
    	int z = reversed_binary_value<digits...>();
    	std::cout << (z+64*y==x);
  	}
};

int main()
{
  	int t; std::cin >> t;

  	for (int i=0; i!=t; ++i) {
		int x, y;
    	cin >> x >> y;
    	CheckValues<6>::check(x, y);
    	cout << "\n";
  	}
}


Объясните мне как работает этот..."variadic" в плане пакетный параметр в шаблоне вида "bool...d". Я не понимаю как работает это, а точнее то что выделено комментариями. Если остальное более менее я могу разобрать то в этом вообще без идей. Или направьте меня где есть более точный ответ, т.к в поиске этого всего касаются лишь по касательной
  • Вопрос задан
  • 105 просмотров
Решения вопроса 1
@Mercury13
Программист на «си с крестами» и не только
Этот шаблон вычисляет при компиляции такое:
rbv<false, false, true, true>() = 11002.

И состоит из двух частей.
1. Для одного параметра у нас напрямую написан шаблон.

2. Для false, false, true, true — у нас используется второй шаблон: a=false, b=false, d = (true, true).
И он равняется (rbv<false, true, true> << 1) + false.

Чтобы вычислить новый rbv, снова работает второй шаблон: a = false, b = true, d = (true).
И он равняется (rbv<true, true> << 1) + false.

Для третьего rbv у нас a = true, b = true, d = ().
Внимание, список d может быть и пусттым. Потому, чтобы не было конфликта с первым шаблоном, второй пишется для двух и более параметров.
И третье наше значение равняется (rbv<true> << 1) + true.

Вот тут работает первый шаблон и получается 112.
Дальше уже можно вычислить все rbv по очереди и получить 11002.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
zagayevskiy
@zagayevskiy
Android developer at Yandex
Этакая рекурсия на этапе компиляции. Например, изначально шаблон специфицирован n параметрами (... как раз подразумевает неизвестное количество параметров). Если n==1, то выбирается первая функция, и результат возвращается сразу. Иначе n > 1 и выбирается вторая функция. Все параметры шаблона разбиваются по принципу параметр 1, параметр 2, всё, что осталось. Параметр 2(b) нужен в этом случае для того, чтобы не произошло конфликта при n == 1. Далее шаблон снова специфицируется, уже меньшим количеством параметров. По индукции получаем конечность этого процесса.

В современном С++ не силён, так что в терминах могут быть ошибки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы