6 votes

Façon élégante d'exprimer shift left OR right dans un template.

J'ai actuellement une fonction de modèle qui, en fonction de ses paramètres de modèle A et B, peut décaler une valeur vers la gauche ou vers la droite :

template <int A, int B> void f(X) {
// ...
if (A >= B)
{
  SetValue(X << (A-B));
}
else // (A < B)
{
  SetValue(X >> (B-A));
}

Lorsque j'instancie le modèle pour A<B je reçois un avertissement pour un décalage négatif à droite sur la première branche (inaccessible), et sinon je reçois un avertissement pour un décalage négatif à gauche sur la première branche. Notre base de code est exempte d'avertissements, ce qui n'est pas acceptable. Existe-t-il une alternative concise et lisible à ces deux déclarations de décalage ?

Des questions similaires (par exemple Déplacement dynamique vers la gauche OU la droite ) n'ont pas cet avertissement intempestif car la distance de décalage est une variable d'exécution.

0voto

jcoder Points 14982

Que diriez-vous de quelque chose comme ceci :-

#include <iostream>

template <int A, int B, bool D> class shift
{
};

template <int A, int B> class shift<A, B, false>
{
public:
    static int result(int x) {return x << (B-A);}
};

template <int A, int B> class shift<A, B, true>
{
public:
    static int result(int x) {return x >> (A-B);}
};

template <int A, int B> int f(int x)
{
    return shift<A, B, (A>B)>::result(x);
}

int main()
{
    std::cout << f<1, 2>(10) << "\n";
    std::cout << f<2, 1>(10) << "\n";
}

0voto

MSalters Points 74024

Pour répondre à ma propre question : avec C++17, c'est maintenant facile.

template <int A, int B> void f(X) {
if constexpr (A >= B)
// ^^^^^^^^^
{
  SetValue(X << (A-B));
}
else // (A < B)
{
  SetValue(X >> (B-A));
}

La branche où le décalage est négatif sera jeté .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X