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

How to get a reference to the negation of a 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++ 有没有类似的效果?

在幕后,引用等同于指向某个变量的常量指针(编译器只是为您提供了如何使用此类指针的语法糖,以便它们始终被初始化)。 因此,您不希望拥有相同的变量和两个指向它的不同指针,其中一个将取消引用 true,另一个将取消引用 false。这显然是不可能的。 OOP 的方法是不传递对布尔值的引用,而是传递给 类 的一些接口,并使用使用相同布尔变量的实现:

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