Utilisation de enable_if sur un argument de modèle par défaut pour un constexpr lambda


Francis Cugler

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_ifou std::enable_if_tde tester si le type Test un type arithmétique valide en utilisant std::is_arithmeticou 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>();
}
bolov

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); 
};

Articles connexes


Utilisation de l'argument de modèle par défaut

Gowrath Cette question est mieux posée par l'exemple. Disons que je veux déclarer un std::priority_queueavec une fonction de comparaison. Je pourrais faire: auto cmp_fn = [](const std::string& left, const std::string& right) { return right < left; }; std: