Utilisation de enable_if sur un argument de modèle par défaut pour un constexpr lambda
J'essaye d'écrire une fonction générique qui retournera toujours un fichier -1
. Je veux que la liste d'arguments du modèle soit par défaut int
. J'essaie d'utiliser std::enable_if
ou std::enable_if_t
de tester si le type T
est un type arithmétique valide en utilisant std::is_arithmetic
ou std::is_arithmetic_v
. J'ai des problèmes de syntaxe pour pouvoir le compiler correctement. Voici à quoi ressemble mon lambda:
template<typename T = int,
std::enable_if_t<std::is_arithmetic_v<T>> >
static constexpr T negative_one = [](){
return static_cast<T>(-1);
};
C'est une fonction et un concept très triviaux, mais le compilateur veut se plaindre que l'argument par défaut ne se trouve pas à la fin de la liste d'arguments ... À quoi ressemblerait sa définition correcte?
Voici comment je l'utiliserais:
{
int i = negative_one();
float f = negative_one<float>();
}
Utilisez un argument de modèle facultatif non-type pour sfinae. Votre type doit être un type lambda (pas T
) si vous voulez l'appeler / le transmettre comme prédicat. Vous pouvez y parvenir avec la déduction automatique de type.
template<typename T = int, std::enable_if_t<std::is_arithmetic_v<T>, int> = 0>
static constexpr auto negative_one = [](){
return static_cast<T>(-1);
};
Une autre option pourrait être d'utiliser une fonction au lieu d'un lambda:
template<typename T = int, std::enable_if_t<std::is_arithmetic_v<T>, int> = 0>
static constexpr T negative_one() {
return static_cast<T>(-1);
};