Considérez ceci :
template <typename Pack, template <typename...> class = std::tuple> struct foo;
template <template <typename...> class P, typename... Ts, template <typename...> class Q>
struct foo<P<Ts...>, Q> {
using type = Q<P<Ts>...>;
};
J'ai placé le modèle par défaut dans le typedef pour être std::tuple
pour que ça compile, mais ce que je veux en fait, c'est que le modèle par défaut soit P
et je ne connais pas de syntaxe qui le permette. J'ai gardé le typedef simple pour illustrer le point, qui est d'essayer d'avoir P
comme modèle par défaut. J'ai donc trouvé la solution suivante, qui semble assez moche :
template <typename Pack, template <typename...> class...> struct foo;
template <template <typename...> class P, typename... Ts, template <typename...> class Q>
struct foo<P<Ts...>, Q> {
using type = Q<P<Ts>...>;
};
template <template <typename...> class P, typename... Ts>
struct foo<P<Ts...>> {
using type = P<P<Ts>...>;
};
Y a-t-il une meilleure façon de procéder que celle-ci ? Peut-être une syntaxe c++17 que je ne connais pas ?