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
,并且 B
和 C
的传递值是预先知道的(在编译时),甚至可能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;
};
我正在尝试实现以下行为:
我有两个 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
,并且 B
和 C
的传递值是预先知道的(在编译时),甚至可能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;
};