28 votes

c++ marquer une valeur d'enum comme dépréciée ?

Est-il possible de marquer une valeur d'enum comme étant dépréciée ?

par exemple

enum MyEnum {
    firstvalue = 0
    secondvalue,
    thirdvalue, // deprecated
    fourthvalue
};

Une solution de second prix serait d'ifdef une solution MSVC et une solution GCC.

1voto

al-Acme Points 11571

Utilisation de pragmas dépendants du compilateur : Voici la documentation pour Gcc y Visual Studio .

1voto

Mark B Points 60200

Vous pourriez être en mesure d'utiliser une macro pirate.

enum MyEnum {
    firstvalue = 0
    secondvalue,
    real_thirdvalue, // deprecated
    fourthvalue
};

template <MyEnum v>
struct real_value
{
    static MyEnum value()
    { 
        1 != 2U;  // Cause a warning in for example g++. Leave a comment behind for the user to translate this warning into "thirdvalue is deprecated"
        return v;
    }
};

#define thirdvalue (real_value<real_thirdvalue>::value());

Cela ne fonctionnera pas dans un contexte où une constante est nécessaire.

0voto

Emile Cormier Points 13654

J'ai une solution (inspirée de celle de Mark B) qui utilise boost/serialization/static_warning.hpp. Cependant, la mienne permet thirdvalue pour être utilisé comme une constante symbolique. Il produit également des avertissements pour chaque endroit où quelqu'un tente d'utiliser thirdvalue .

#include <boost/serialization/static_warning.hpp>

enum MyEnum {
    firstvalue = 0,
    secondvalue,
    deprecated_thirdvalue, // deprecated
    fourthvalue
};

template <int line>
struct Deprecated
{
    BOOST_SERIALIZATION_BSW(false, line);
    enum {MyEnum_thirdvalue = deprecated_thirdvalue};
};

#define thirdvalue (static_cast<MyEnum>(Deprecated<__LINE__>::MyEnum_thirdvalue))

enum {symbolic_constant = thirdvalue};

int main()
{
    MyEnum e = thirdvalue;
}

Avec GCC, j'obtiens des avertissements qui, en fin de compte, pointent vers les lignes coupables contenant thirdvalue .

Il convient de noter que l'utilisation de l'option Deprecated fait en sorte qu'une ligne de sortie du compilateur "instancié ici" indique où l'enum déprécié est utilisé.

Si vous pouvez trouver un moyen de générer de manière portative un avertissement à l'intérieur de l'élément Deprecated vous pouvez alors vous passer de la dépendance à Boost.

0voto

user2023370 Points 2604

La prise en charge par C++14 d'une norme d'attributs syntaxiques (dont les [[deprecated]] ) a amélioré celle de C++11 en permettant aux énumérateurs d'être également annotés (voir N3760 ). Cela signifie que l'exemple de l'OP peut maintenant ressembler à ceci :

enum MyEnum {
  firstvalue = 0,
  secondvalue,
  thirdvalue [[deprecated]],
  fourthvalue
};

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