加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 有没有办法找到任意类类型的直接基类(如果有的话)?

发布时间:2020-12-16 07:23:07 所属栏目:百科 来源:网络整理
导读:我想创建一个存储对象,我可以在其中设置/获取软件应用程序中各种类型的属性. (我们只是说该属性是一个字符串.)如果尝试检索某个类型T的属性,而该类型T之前没有存储任何属性,我希望为大多数派生类型返回的属性是T的基类.我希望所有这些对存储属性的类类型没有
我想创建一个存储对象,我可以在其中设置/获取软件应用程序中各种类型的属性. (我们只是说该属性是一个字符串.)如果尝试检索某个类型T的属性,而该类型T之前没有存储任何属性,我希望为大多数派生类型返回的属性是T的基类.我希望所有这些对存储属性的类类型没有任何特殊要求.

所以基本上,它应该看起来像这样.

class Store
{
  public:
    template <class T> void put(const string& property) { /* MAGIC HERE */ }
    template <class T> string get() const { /* MORE MAGIC */ }
};

class X {};
class Y : public X {};
class Z : public Y {};

int main()
{
    Store store;
    store.put<X>("x");
    store.put<Z>("z");
    cout << store.get<X>() << endl;
    cout << store.get<Y>() << endl;
    cout << store.get<Z>() << endl;
    return 0;
}

输出应该如下所示:

x
x
z

这对C来说甚至可能吗?使用java反射会很容易.

解决方法

执行此操作的“传统”方法是将类型别名放入父类(或元组中的类<>)并使用duck-typing检索它.

class X {
  // can be resolved automatically with SFINAE,but having an explicit "no parent" 
  // allows to catch mistakes at compile-time more easily.
  using parent_t = void;
};

class Y : public X {
  using parent_t = X;
};

class Z : public Y {
  using parent_t = Y;
};

它是一个相当少量的样板,很少在我看到它使用的任何地方造成很大的摩擦.

从那时起,在您的情况下,使用std :: unordered_map< std :: type_index,std :: string>实现Store;是非常微不足道的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读