Chouette. Je tente, le résultat n'est pas si mal: https://godbolt.org/z/GWvsxW44P mais... il manque encore un truc histoire que cela ne soit pas trop compliqué à manipuler: je voudrais pouvoir convertir implicitement un littéral en `domain::set<decltype(litteral), littéral, littéral>`. Dit autrement, comment faire que `domain::set{42.5}` serve à construire automatiquement un `domain::set<double, 42.5, 42.5>`.
J'ai l'impression que les règles de CTAD ne s'appliquent pas sur les non-type-template-parameters (NTTP). J'ai tenté des choses comme
template <typename T, auto min_, auto max_>
struct set
{
constexpr explicit set(T value_) noexcept : m_value(value_)
{
assert(can_contain(value_));
}
// N'a pas l'air utilisé
constexpr explicit set(T value) -> set<value, value>;
....
// Ou encore
};
template <typename T>
set(T value) -> set<T, value, value>;
template <typename T>
consteval auto as_set(T value) {
return set<T, value, value>{value};
}
Est-ce que ce n'est pas permis (voire pas implémenté (*)) ? Ou alors il faut s'y prendre autrement.
NB: Je vois bien des solutions à base de User Defined Litterals où 42._c serait du bon type, mais j'aimerai quelque chose de plus simple pour l'utilisateur final.
(*) Pour l'instant ni clang11, ni GCC 10 ne supporte les NTTP de type flottants. D'où que je partage le code directement sur godbolt.
Comme les paramètres ne sont jamais des valeurs constexpr, il n'est pas possible de propager une valeur de construction en paramètre template sans UDL ou autres magouilles. Pour le moment, toutes les propositions qui vont dans le sens de paramètre constepxr sont rejetées au profil de choses bancales comme std::is_constant_evaluated...
Par contre, tu peux transformer domain::set<T, auto min, auto max> en domain::set<auto min, auto max = min> pour ainsi faire domain::set<42.5>. Mais à moins de le forcer dans ce cas de figure, il faudra toujours indiquer le paramètre lors de la construction.
Une autre manière serait de passer par une fonction template<auto min_max> qui s'occupe cette construction.
Dans tous les cas, il n'y a ma connaissance aucun moyen d'avoir une syntaxe uniforme pour déduire un type depuis des valeurs.
Auto-déduction de non-type-template-param (double)
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.