constexpr 变量的继承和设置

Inheritance and setting of a constexpr variable

我正在尝试实现以下行为:

我有两个 class,继承自同一个 class。他们两个都会执行一些工作,在某个时刻改变他们的状态,而在某个时刻,这个状态需要被检查。检查是相似的,对于两个 classes,在两个测试中,我们将实际状态与期望状态进行比较。唯一不同的是所需的状态,它是 class 依赖的。

在代码中,我如何实现这一点的最小示例如下:

#include <iostream>

class A {
public:
    static int x = 1;
    int y;
    A(int _y): y(_y) {}

    void test() {
        bool passed = x == y;
        std::cout << "Test" << (passed ? "" : " not") << " passed\n";
    }
};

class B : public A {
public:
    B(int _y): A(_y)
    {
        x = 2; 
    }
};

class C : public A {
public:
    C(int _y) : A(_y)
    {
        x = 3;
    }
};

int main()
{
    B b(2);
    b.test(); // Test passed

    C c(2);
    c.test(); // Test not passed
    return 0;
}

因此,如果 y 的值为 2,则 B 的实例通过测试,而如果值为 3,则 C 的实例通过测试.然而,我不喜欢这个实现的是 x 的值可以改变——即使 x 是私有的,朋友 class 仍然可以修改它。理想情况下,我想要的是将 x 定义为 const,并且 BC 的传递值是预先知道的(在编译时),甚至可能constexpr.

我的问题如下:

是否可以使用 x 的 const 或 constexpr 值实现上述行为? x 的值是否可以为每个继承的 class 设置,但仍然在基础 class 中测试?

模板似乎有帮助,尤其是当继承似乎只是在这里分解代码时:

template <int x>
class A {
public:
    int y;
    A(int _y): y(_y) {}

    void test() {
        bool passed = x == y;
        std::cout << "Test" << (passed ? "" : " not") << " passed\n";
    }
};

// using B = A<2>; // Seems even enough in your example
class B : public A<2> {
public:
    using A<2>::A;
};

class C : public A<3> {
public:
    using A<3>::A;
};