【问题标题】:How to access different arrays of different types with a unique scoped enum?如何使用唯一作用域枚举访问不同类型的不同数组?
【发布时间】:2021-03-08 21:52:49
【问题描述】:

我有 2 个结构(ScreenNScreenR)从基础结构(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++ 有静态类型。函数返回ScreenNScreenR。它有时不能返回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

标签: c++ c++17


【解决方案1】:

那么你想要的是让getScreen 根据运行时参数(枚举)返回不同的类型?对吗?

这不是 C++ 的工作方式;它是一种静态类型的语言。每个函数都有一个返回类型;并且该类型是在编译时确定的。

现在,至于你的尝试:

  • 模板 - 这些模板删除了多个运行程序副本(在这种情况下),每个副本都有自己的(静态)返回类型。但正如您所发现的,您无法决定在运行时调用哪一个。

  • variant - 您可以从 getScreen 返回 variant&lt;ScreenN, ScreenR&gt; 并让调用者找出它是哪一个 - 但这会将所有复杂性推回到调用者身上。

  • inheritance - 您可以将数组包装在从基址继承的结构中,并返回指向基址的指针;但这与variant 有相同的缺点(即,它迫使调用者处理复杂性)。

【讨论】:

  • 实际上,我在我的代码库中使用了一个数组,其中包含一个包含所有数据的结构......我的问题更多是关于是否可以使用可能不太为人所知的技术来完成,但由于答案是否定的,我不会进一步推动此事。谢谢你的回答:)
猜你喜欢
  • 2013-07-25
  • 2017-12-29
  • 1970-01-01
  • 2022-06-11
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
相关资源
最近更新 更多