【问题标题】:Making public data members unreachable in C++在 C++ 中使公共数据成员无法访问
【发布时间】:2018-10-08 21:53:49
【问题描述】:

我有一个场景,根据规范名称,我想让某些结构的成员无法访问。下面是一个例子:

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,它以一个枚举类作为它的键,并返回一个在Label 结构中定义的结构。现在基于Label 结构中的键,我想让struct data 的任意成员在主函数中无法访问。这样的事情可能吗?我可以在运行时更改operator[] 中结构的访问权限吗?

【问题讨论】:

    标签: c++ class c++11


    【解决方案1】:

    不,你不能。这在语法上是不可能的,并且在编译时会静态检查访问权限,因此在运行时对您没有用处。

    如果你想让一些值不存在并且能够像这样表示它们,你可以使用std::optional之类的东西

    也许this 有助于您静态地组合结构。这仅在方案静态可用时才有效。

    【讨论】:

    • 我想根据架构类型限制对data 成员的访问。 data 是所有方案中所有数据成员的超集。提供模式时,它可能不会包含所有成员,因此我正在寻找一种在提供规范后限制访问的方法。
    • 如果您在某一时刻静态地知道它是哪种方案,您可以只使用另一个结构,因为这样您就知道要使用哪个,或者只使用您想要的值。如果没有,你想发生什么?你想要一个编译错误吗?还是您希望语句在运行时不执行?
    • 我不想使用另一个结构,因为那将是很多代码重复,而我只是想从现有的结构中失效。方案信息是静态可访问的。我想要完成的是当另一个程序员开始使用这种设计时,我不希望他们访问不属于特定方案版本的成员。上面是一个超集,但我希望用户只能访问相关的数据成员。
    • 编辑了我的答案
    猜你喜欢
    • 2012-10-06
    • 2015-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 2013-10-28
    • 1970-01-01
    • 2011-05-17
    相关资源
    最近更新 更多