2 votes

c++ auto type signed to/from unsigned conversion

Je veux écrire une fonction qui effectue des opérations bit à bit sur un paramètre qui est auto type.

  • Le type transmis peut être unsigned int ou int (avec des largeurs différentes).
  • Je veux seulement effectuer des opérations bit à bit sur unsigned types.

J'ai besoin d'un opérateur qui renvoie le unsigned version du type de données original. Dans l'exemple de fonction ci-dessous, l'"opérateur" unsigned_type me donnerait le type de données que value a mais assure qu'il est non signé.

  • int -> unsigned int
  • int16_t -> uint16_t
  • uint16_t -> uint16_t

Exemple de fonction :

auto bit_shifting_and_mask(auto value) -> decltype(value)
{
    unsigned_type(value) unsigned_value = static_cast<unsigned_type(value)>(value);

    unsigned_value >>= 8u;       // Contrived bit manipulation
    unsigned_value &= 0xABCDu;   // here ...

    return static_cast<decltype(value)>(unsigned_value);
}

Y a-t-il un moyen d'effectuer l'opération unsigned_type par rapport à un type de données obtenu à partir de decltype ?

Merci.

3voto

Zrax Points 335

C++11 possède un std::make_unsigned l'utilité dans <type_traits> :

auto bit_shifting_and_mask(auto value) -> decltype(value)
{
    auto unsigned_value = static_cast<std::make_unsigned<decltype(value)>::type>(value);

    unsigned_value >>= 8u;       // Contrived bit manipulation
    unsigned_value &= 0xABCDu;   // here ...

    return static_cast<decltype(value)>(unsigned_value);
}

Avec C++14, vous pouvez simplifier encore plus en utilisant std::make_unsigned_t au lieu de std::make_unsigned::type .

2voto

Poeta Kodu Points 673

faire_non_signé comme l'a dit Jarod42.

auto bit_shifting_and_mask(auto value) -> decltype(value)

Ce n'est pas ainsi que vous voulez rendre cette fonction dépendante du type. Utilisez un modèle, sauf si cette fonction est lambda.

2voto

Jive Dadson Points 3563

Cela ne nécessite pas de fonctionnalités qui ne figurent pas (encore) dans la norme. Il se compile sous VS 2017 avec VC++17 activé.

#include <type_traits>
template<typename T>
auto bit_shifting_and_mask(T value) {
    static_assert(std::is_integral_v<T>, 
        "bit_shifting_and_mask(value): value is not integral type");
    using unsgn =std::make_unsigned_t<T>;
    auto unsigned_value = static_cast<unsgn>(value);

    unsigned_value >>= 8u;       // Contrived bit manipulation
    unsigned_value &= 0xABCDu;   // here ...

    return unsigned_value;
}

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