Estou construindo trait-types (semelhantes a std::type_identity) para representar templates de diferentes tipos. Templates de valores variádicos de tipos mistos são um caso especial, e só consigo pensar em criá-los por meio de structs aninhadas, como mostrado abaixo.
O clang aceita isso, o gcc não.
template <typename ... Ts>
struct variadic_value_metatemplate_builder
{
template <template <Ts ... tt_Vs> typename TT>
struct build
{
template <Ts ... Vs>
using type = TT<Vs ...>;
};
};
( link compilador-explorador )
O erro do gcc é:
<source>:8:39: error: expansion pattern 'tt_Vs' contains no parameter packs [-Wtemplate-body]
8 | using type = TT<Vs ...>;
quem está certo?
A formulação do erro do gcc parece incorreta, mas acho que está relacionada à exigência de que Vs ...
e Ts ...
tenham o mesmo tamanho, o que Vs ...
não o torna livremente variável. Mas, pelo que sei, todos ainda são pacotes de parâmetros .
EDITAR: À PARTE: Por que isso pode ser útil?
Na verdade, é bem difícil criar um caso de uso prático (para esse tipo específico de modelo-modelo), mas aqui está minha tentativa rápida (altamente implausível, não muito boa).
Você está escrevendo uma rotina de teste para um grupo de operações gráficas de modelo. Algumas são do formato <int DIMENSION>
, outras são <int DIMENSION, bool UNDO>
, etc... Você quer escrever uma rotina de teste genérica para todos os formatos , que recebe um parâmetro de formulário, um conjunto de operações gráficas correspondentes e um conjunto de valores de teste constexpr para os parâmetros. Você pode então fazer algo como:
generic_graphics_test<metabuilder_DIMENSION_UNDO, variadic_auto_constants<2, false>, variadic_auto_constants<3, true>, [etc...]>::test<gfx_translate, gfx_scale, [etc...]>()
;
para testar de alguma forma as variedades 2D e 3D reversíveis de gfx_translate
e gfx_scale
. (onde test()
recebe instâncias de build
(acima) como parâmetros de modelo, que aqui representam as operações de modelo de translação e escala (brutas e não resolvidas) (como functores ou algo assim)).
(... isso é como meta-aninhamento-nível-4 ou algo assim :)
((Espero que pelo menos 17% disso seja semi-compreensível :))
Infelizmente, ainda não existe uma palavra-chave genérica "parâmetro-de-modelo-de-tipo-ou-valor-possivelmente-variádico" (seria muito bom, mas provavelmente seria muito difícil escrever código de compilador para ela), que permitiria que cada tipo possível de modelo-modelo fosse representado por um único modelo de característica.