Установить тип данных членов в конструкторе в зависимости от параметра - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть класс со значением перечисления в качестве параметра.У него есть член m_ConsistencyErrors, который является std::set.Я хотел бы установить тип этого члена при построении в зависимости от значения параметра enum.

, если значение TestType равно MSG123_CONSISTENCY_TEST Я бы хотел, чтобы m_ConsistencyErrors имел тип std::set<EnMsg123Param>

если значение TestType равно MSG5_CONSISTENCY_TEST Я бы хотел, чтобы m_ConsistencyErrors типа std::set<EnMsg5Param>

Есть ли чистый способ добиться этого или я должен найти другое решение.

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

1 Ответ

0 голосов
/ 14 февраля 2019

Вы не можете сделать это, ParameterType должен знать все время, когда вы используете CMsgConsistencyTest и когда его члены имеют доступ к m_ConsistencyErrors

Для этого CMsgConsistencyTest может быть классом шаблона, например

#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;

, в противном случае вам может потребоваться сделать что-то уродливое и катастрофическое и «не C ++», например:

   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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...