首页 文章

获取当前持有的std :: variant的typeid(如boost :: variant type())

提问于
浏览
1

我已经从boost :: variant迁移到std :: variant,并遇到了障碍 .

我在boost 'type()'中使用了一个很好的函数,可以让你获得当前持有的typeid . 见https://www.boost.org/doc/libs/1_48_0/doc/html/boost/variant.html#id1752388-bb

如何用std :: variant实现这一目标?

我在'type_index'上有一个无序的映射键,它包含一些值'std :: function' . 我的变体,取决于类型,将决定我从 Map 中抓取什么功能来进行一些操作 . (我的代码太大了,无法发布) .

除了为特定的std :: variant编写特定访问者之外的任何实现想法?也许在std :: variant上使用'index()'函数,然后索引到变体的类型列表?有点像这样:How to get N-th type from a tuple?

2 回答

  • 3
    template<class V>
    std::type_info const& var_type(V const& v){
      return std::visit( [](auto&&x)->decltype(auto){ return typeid(x); }, v );
    }
    

    另外

    template<class...Ts>
    std::type_info const& var_type(std::variant<Ts...> const& v, std::optional<std::size_t> idx={}){
      if (!idx) idx=v.index();
      if(*idx==std::variant_npos) return typeid(void);
      const std::array<std::type_info const*, sizeof...(Ts)> infos[]={ &typeid(Ts)... };
      return *(infos[*idx]);
    }
    

    这可以让您询问其他非活动的索引 .

  • 4

    问题是当前选择的类型仅在运行时已知,而"obtaining"类型必须在编译时完成 . 这正是我们有访客的原因 - 隐藏 variant 实施背后不可避免的 if 语句链 .

    最好是从这样的访问者内部执行 Map 调度,而不是重新发明该实现 .

    如果做不到这一点,你将不得不编写自己的 if 语句链,产生类似于访问者使用的代码,但可能更慢,更难维护!

    确实,你不能通过阅读 index() 来实现这样的事情,然后让变量给你等效的 typeid ,就像你使用Boost实现一样 . 但是我有意思,因为(正如我上面所建议的)任何使用它的代码都是不明智的 . 当然,如果你真的想,你可以写一个访客来制作这样的 typeid !但是,当你可以首先将逻辑放入访问者时,你仍然必须编写条件逻辑来处理这个值 .

相关问题