Создание общедоступных членов данных недоступно в C ++ - PullRequest
0 голосов
/ 09 октября 2018

У меня есть сценарий, в котором, основываясь на имени спецификации, я хочу сделать членов какой-либо структуры недоступными.Ниже приведен пример:

enum schema { IFC_1, IFC_2, IFC_3, IFC_4 };

template <typename T>
using map_type = map <schema, T>;

struct Label
{
    //Imaginary Superset of Label
    //From different specs
    struct data {
        variant <int, char, string> x;
        variant <int, char, string> y;
        variant <int, char, string> z;
        variant <int, char, string> a;
        variant <int, char, string> b;
    };

    map_type<data> abc;
    data & operator[] (const schema & key){
        data & obj = abc[key];
        /*
        if(key == IFC_1)
            then make some members unreachable.
            at compiletime or runtime
        */
        return abc[key];
    }
};

int main(){
    Label x;
    x[IFC_1].x = 0; // all member above are accesible
    x[IFC_2].x = 0; // is it possible to make x unreachable when spec is IFC_2?
    return 0;
}

В вышеприведенном коде есть структура Label, в которой std :: map принимает класс enum в качестве ключа и возвращает структуру, определенную в Label структура.Теперь, основываясь на ключе в Label struct, я хочу сделать произвольные члены struct data недоступными в основной функции.Возможна ли такая вещь?Могу ли я изменить разрешение доступа к структуре в operator[] во время выполнения?

1 Ответ

0 голосов
/ 09 октября 2018

Нет, ты не можешь.Это синтаксически невозможно, и доступ проверяется статически при компиляции, поэтому он не будет использоваться для вас во время выполнения.

Если вы хотите, чтобы некоторые значения отсутствовали, и могли представлять их таким образом, выможет использовать что-то вроде std :: необязательное

Может быть это полезно для того, чтобы вы могли составить структуру статически.Это работает, только если схемы доступны статически.

...