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



我已经从boost::variant迁移到std::variation,遇到了一个障碍。

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

如何使用std::变体实现这一点?

我在"type_index"上有一个无序的映射键,它包含一些值"std::function"。我的变体,取决于类型,将决定我从地图中获取什么函数来进行一些操作。(我的代码太大了,无法发布(。

除了为特定的std::变体编写特定的访问者之外,还有什么实现想法吗?也许对std::variant使用"index(("函数,然后索引到variant的类型列表中?有点像这样:如何从元组中获得第N个类型?

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]);
}

它允许您询问其他未激活的索引。

问题是当前选择的类型只有在运行时才知道,而"获取"类型必须在编译时完成。这正是我们吸引访客的原因—以隐藏CCD_ 2实现背后不可避免的CCD_。

与其重新发明这种实现,不如从这样一个访问者内部执行地图调度。

如果做不到这一点,您将不得不编写自己的if语句链,生成类似于访问者使用的代码,但可能速度较慢,维护性较差!

确实,您不能像Boost实现那样,通过读取index()然后要求变体为您提供等效的typeid来实现这样的事情。但我确信这是经过深思熟虑的,因为(正如我上面所建议的(任何使用它的代码都是不明智的。当然,如果你真的想,你可以写一个访问者来制作这样的typeid!但是,您仍然需要编写条件逻辑来处理该值,而您本来可以将该逻辑放入访问者中。

相关内容

最新更新