【发布时间】:2021-03-08 21:52:49
【问题描述】:
我有 2 个结构(ScreenN 和 ScreenR)从基础结构(Screen)继承。他们只有没有成员的 POD 数据。
struct Screen {
int base {10};
};
struct ScreenN : public Screen {
int spe_n {20};
};
struct ScreenR : public Screen {
int spe_r {30};
};
一个包含 2 个结构数组的 Test 类:
class Test {
public:
auto getScreen(const Bg s){};
private:
std::array<ScreenN, 2> n_;
std::array<ScreenR, 2> r_;
};
最后是一个作用域枚举,用于访问各种结构:
enum class Bg : unsigned char{
n0,
n1,
r0,
r1
};
我的目标是使用相同的范围枚举访问两个数组元素:
Test t;
const auto s = Bg::n0;
std::cout << t.getScreen(s).spe_n << std::endl;
std::cout << t.getScreen(Bg::n0).spe_n << std::endl;
std::cout << t.getScreen(Bg::r0).spe_r << std::endl;
鉴于我确切知道哪个枚举条目链接到哪个数组元素:
Bg::n0 -> n_[0]
Bg::n1 -> n_[1]
Bg::r0 -> r_[0]
Bg::r1 -> r_[1]
我希望能够直接访问派生结构数据,即使它们不是同一类型,有没有办法实现这一点? (即编码getScreen(const Bg s){}的最佳方式是什么)
我试过了:
- 模板 -> 仅在编译时有效,因此
t.getScreen(Bg::n0).spe_n有效,但t.getScreen(s).spe_n无效。 - std::variant -> 我还没弄清楚如何使用 std::visit 返回我想要的值
- inheritance -> 可以很好地用于函数,但我也希望能够访问 POD 数据...
感谢您的帮助!
【问题讨论】:
-
C++ 有静态类型。函数返回
ScreenN或ScreenR。它有时不能返回ScreenN,有时不能返回ScreenR,具体取决于您传递的参数。如果您正在编写t.getScreen(s).spe_n,则静态已知t.getScreen(s)是ScreenN,并且您正在编写t.getScreen(s).spe_r,静态已知t.getScreen(s)是ScreenR。尝试使t.getScreen(s)在两种情况下都具有相同的类型没有多大意义。只需使用两个不同的函数,一个返回ScreenN,一个返回ScreenR。