Définir un type de données Membres dans le constructeur en fonction du paramètre

voix
3

J'ai une classe avec une valeur ENUM en tant que paramètre. Il a un membre m_ConsistencyErrorsqui est un std::set. Je voudrais définir le type de ce membre à la construction en fonction de la valeur du paramètre ENUM.

si la valeur est TestType MSG123_CONSISTENCY_TESTje voudrais m_ConsistencyErrors à être de typestd::set<EnMsg123Param>

si la valeur est TestType MSG5_CONSISTENCY_TESTje voudrais m_ConsistencyErrors à être de typestd::set<EnMsg5Param>

Est-il un moyen propre pour y parvenir ou devrais-je trouver une autre solution.

class CMsgConsistencyTest // : public CTestBase  // left out for simplicity
{
    enum EnTests
    {
        MSG123_CONSISTENCY_TEST,
        MSG5_CONSISTENCY_TEST,
    };
    enum EnMsg123Param
    {
        Msg123_1,
        Msg123_2
    };
    enum EnMsg5Param
    {
        Msg5_1,
        Msg5_2
    };

public:
    CMsgConsistencyTest(const EnTests TestType) //  : CTestBase(TestType)  // left out for simplicity
    {
        if (TestType == MSG123_CONSISTENCY_TEST)
        {
            ParameterType = EnMsg123Param;  // pseudo code
        }
        else if (TestType == MSG5_CONSISTENCY_TEST)
        {
            ParameterType = EnMsg5Param;  // pseudo code
        }
    }

private:
    template<typename ParameterType>
    std::set<ParameterType> m_ConsistencyErrors;
};
Créé 14/02/2019 à 14:53
utilisateur
Dans d'autres langues...                            


1 réponses

voix
1

Vous ne pouvez pas faire cela, ParameterType doit être savoir tout le temps lorsque vous utilisez CMsgConsistencyTest et lorsque l' accès à ses membresm_ConsistencyErrors

Pour que CMsgConsistencyTest peut être une classe de modèle, par exemple

#include <set>

enum EnMsg123Param
{
  Msg123_1,
  Msg123_2,
};

enum EnMsg5Param
{
  Msg5_1,
  Msg5_2,
  Msg5_3,
};

template<typename ParameterType>
class CMsgConsistencyTest // : public CTestBase  // left out for simplicity
{
  public:
    // ...
  private:
    std::set<ParameterType> m_ConsistencyErrors;
};

// and for instance

CMsgConsistencyTest<EnMsg123Param> A;
CMsgConsistencyTest<EnMsg5Param> B;

sinon vous pourriez avoir à faire quelque chose de laid et catastrophique et «non C ++ comme ça:

   CMsgConsistencyTest(const EnTests TestType) //  : CTestBase(TestType)  // left out for simplicity
    {
        if (TestType == MSG123_CONSISTENCY_TEST)
        {
            m_ConsistencyErrors = new set<EnMsg123Param>;
        }
        else if (TestType == MSG5_CONSISTENCY_TEST)
        {
            m_ConsistencyErrors = new set<EnMsg5Param>;
        }
        // else ?
        // probably need to save TestType etc
    }

private:
    void * m_ConsistencyErrors;
Créé 14/02/2019 à 15:10
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more