Как спроектировать перечисление со значением времени выполнения? - PullRequest
0 голосов
/ 24 сентября 2019
class MyFileOperation
{
    int iUserReadPos;
    string sArticleBuffer;
    string sExtraInfo;
    enum Offset
    {
        ofsUserReadPos = 0, ofsArticleBuffer, ofsExtraInfo
    };
public:
    MyFileOperation(string filename)
    {
        /*By reading the file, I know the values of iUserReadPos, sArticlBuffer and sExtraInfo*/
        /*Then I want to assign the values Offset items*/
        ofsUserReadPos = 0;
        ofsArticlBuffer = sizeof(iUserReadPos);
        ofsExtraInfo = sizeof(string::size_type) + sArticlBuffer.length();
    }
    void MoveTo(Offset ofs)
    {
        f.seekp(ios::beg+ofs);
    }

    void SomeUsingOfMoveTo()
    {
        MoveTo(ofsExtraInfo);
    }
};

Я хочу присвоить значения для смещенных элементов и напрямую использовать эти значения удобно.Конечно, этот код не может быть скомпилирован.Интересно, есть ли новые возможности c ++, такие как enum class или другой дизайн, могут решить эту проблему.

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Нет.Это невозможно.

Перечисление - это отдельный тип (3.9.2) с именованными константами .Его имя становится enum-именем в пределах своей области видимости. (7.2 Объявления перечисления, C ++ 17)

То, что вы спрашиваете, - это оксюморон, потому что enum должна быть скомпилированной постоянной времени, которая (например,кислотный тест) можно даже использовать в качестве параметра шаблона.

Для выполнения задачи может потребоваться любая другая обычная переменная.

0 голосов
/ 24 сентября 2019

Есть простой способ.Вам нужно добавить вектор для записи значений реального смещения;

enum Offset
    {
        ofsUserReadPos = 0, ofsArticleBuffer, ofsExtraInfo, ofsCount
    };

vector<size_t> vtOffset = vector<size_t>(ofsCount);

Если вам нужно соответствующее смещение, просто позвоните vtOffset[ofsUserReadPos].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...