如何获得对bool的否定的引用?

问题描述 投票:0回答:1

例如,如果我有一个bool值v,我希望引用!v,当v发生变化时可以改变。一个示例用途是:

class A {
    bool& isOpen;
    A(bool& value): isOpen(value) {}
    void f() {
        if (isOpen) {
            doSomething();
        }
    }
};

class B {
    bool& isClosed;
    B(bool& value): isClosed(value) {}
    void g() {
        if (isClosed) {
            doSomething();
        }
    }
};

int main() {
    bool isOpen = true;
    A a(isOpen);
    B b(negattive_reference_of(isOpen));
    a.f(); // doSomething()
    b.g(); // do nothing
    isOpen = false;
    a.f(); // do nothing
    b.g(); // doSomething()
}

无论如何在C ++中实现类似的效果?

c++11 boolean-operations
1个回答
0
投票

在引擎盖下引用相当于指向某个变量的常量指针(编译器只是为您提供了如何使用这些指针的语法糖,以便始终初始化它们)。所以你不要有相同的变量和两个不同的指针,其中一个将取消引用true而另一个取消引用false。这显然是不可能的。执行它的OOP是传递不引用boolean但是传递给类的一些接口并使用使用相同布尔变量的实现:

class IIsOpenProvider
{
public:
    virtual ~IIsOpenProvider() = 0;
    virtual bool GetOpenValue() = 0;
};

class IIsClosedProvider
{
public:
    virtual ~IIsClosedProvider() = 0;
    virtual bool GetClosedValue() = 0;
};

class ValueProvider : public IIsOpenProvider, public IIsClosedProvider
{
public:
    bool GetOpenValue() override { return isOpen; }
    bool GetClosedValue() override { return !isOpen; }

private:
    bool isOpen;
};

class A {
    IIsOpenProvider& isOpen;
    A(IIsOpenProvider& value): isOpen(value) {}
    void f() {
        if (isOpen.GetOpenValue()) {
            doSomething();
        }
    }
};

class B {
    IIsClosedProvider& isClosed;
    B(IIsClosedProvider& value): isClosed(value) {}
    void g() {
        if (IIsClosedProvider.GetClosedValue()) {
            doSomething();
        }
    }
};

// usage
ValueProvider val;
A a(val);
B b(val);
© www.soinside.com 2019 - 2024. All rights reserved.