spécialisation de trait et template membre de template
Salut à vous!
Je souhaite surcharger un trait pour une template de structure (Item) membre d'une autre template de structure (System).
Bien entendu, je n'y arrive pas.
Mon compilateur est Visual C++ 2019 en 16.9.6.
Voici le code:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| template <typename... Ts>
// requires Ts.. tous distincts
struct System {
template <typename T>
// requires T est dans Ts
struct Item {
static constexpr std::size_t index = 0;// en vrai, c'est index_in_types<T, Ts...>, mais pour l'exemple, ca suffira bien.
};
};
// le trait (cas général)
template <typename T>
struct trait: std::false_type {};
// le cas que j'essaie d'écrire
template <typename T, typename... Ts>
struct trait< typename System<Ts...>::template Item<T> >: std::true_type {}; |
Visual se plaint pour [c]T[§c] et Ts....
Citation:
Envoyé par Visual C++
error C2764: T : paramètre de modèle non utilisé ou pouvant être déduit dans la spécialisation partielle 'trait< typename System<Ts...>::template Item<T> >'
Soit je suis bigleuse, soit il y a quelque chose d'étrange dont j'ai pas conscience.
Et si j'introduis un alias, j'obtiens le même résultat.
Code:
1 2 3 4 5 6
|
template <typename T, typename... Ts>
using alias = typename System<Ts...>::template Item<T>;
template <typename T, typename... Ts>
struct trait< alias <T, Ts...> >: std::true_type {}; |
L'idée sous-jacente est de pouvoir écrire un concept qui accepte les Item et quelques types construits avec (technique du template expression)
Comment puis-je m'en sortir?