std :: условный для шаблонов variadi c - PullRequest
1 голос
/ 02 мая 2020

Я пытаюсь написать версию std::conditional, которая работает для шаблонов вместо типов (если я правильно понял, std::conditional не будет работать с шаблонами из коробки («несоответствие типа / значения»)), но мое понимание пакетов параметров ограничено.

В любом случае, вот что я сделал:

template<bool, template<class...> class X, template<class...> class Y>
struct conditional_template
{ template<class... Z> using type = X<Z...>; };

template<template<class...> class X, template<class...> class Y>
struct conditional_template<false, X, Y>
{ template<class... Z> using type = Y<Z...>; };

Пока все хорошо, давайте проверим это.

template<class> struct As {};
template<class> struct Bs {};

template<class Ta> using A = std::conditional_t<true, As<Ta>, double>;
template<class Tb> using B = Bs<Tb>;

template<bool choose,
    template<class> class C = conditional_template<choose, A, B>::template type>
struct bla{};


int main()
{
  bla<false> i; // <-- compiles in gcc 9.3, but not in clang
  bla<true> j;  // <-- does not compile in either gcc or clang
}

Итак что происходит со второй строкой, не компилируемой? Сообщение об ошибке:

template.cpp:17:58: error: pack expansion argument for non-pack parameter 'Ta' of alias template 'template<class Ta> using A = std::conditional_t<true, As<Ta>, double>'
   17 | struct conditional_template { template<class... Z> using type = X<Z...>; };
      |                                                          ^~~~

Я запутался, похоже, что g cc распаковывает class... Z в Ta, хорошо, но затем он пытается снова распаковать Ta (что должен произойти сбой), но только если используется в std::conditional oO

РЕДАКТИРОВАТЬ: вот ссылка для игры: https://wandbox.org/permlink/XJBjxUf2TLxaPyzq

...