Estou tentando construir a versão "tuplada" de tempo de compilação de std::transform
. Este tipo de características deve receber um std::tuple
, uma característica de tipo unário que "retorna" um tipo (como std::remove_pointer
) e deve produzir um std::tuple
cujos tipos são o resultado da aplicação da característica de tipo ao tipo correspondente da entradastd::tuple
Por exemplo, my_tuple_trasform<std::tuple<int*, float&, double*>, std::remove_pointer>::type
deve ser equivalente a std::tuple<int, float&, double>
.
Eu poderia facilmente escrever uma solução recursivamente, mas estava tentando implementar uma solução "iterativa" por meio de um pacote de expansão e não consigo descobrir o que estou fazendo de errado.
Aqui está meu código:
template <typename Tuple, template<typename> typename TraitPredicate>
struct my_tuple_trasform;
template <template<typename> typename TraitPredicate, typename... Ts>
struct my_tuple_trasform<std::tuple<Ts...>, TraitPredicate>
{
using type = std::tuple<(typename TraitPredicate<Ts>::type)...>;
};
O compilador produz um erro inútil, onde aponta que a expressão
(typename TraitPredicate<Ts>::type)
não é reconhecido como um pacote de parâmetros e também parece pensar que a coisa toda, reticências incluídas, é apenas o primeiro tipo do std::tuple
.