如何提前获取Boost::variant中float类型的存储指针?
问题核心
你现在的问题是:Boost.Variant默认初始化后是第一个模板类型(这里是std::string),此时boost::get<float>会返回nullptr,因为当前活跃类型不是float,对应的存储空间根本没被实例化。你想提前拿到未来float的存储指针,但直接这么做不可行,得换思路。
可行解决办法
办法1:提前把Variant切换成float类型
在DataDispatcher::set里先给variant赋一个float默认值,强制切换活跃类型,这样就能拿到有效指针,后面外部赋值会覆盖这个默认值,完全不影响逻辑:
void set(DataContainer* dc) { // 先切换到float类型,随便赋个默认值就行 dc->value = 0.0f; // 现在get<float>就能拿到有效指针了 fpointer = boost::get<float>(&dc->value); }
办法2:存DataContainer指针而非float指针
别直接存float指针,改成保存DataContainer的指针,到dispatch阶段(此时已经保证是float类型)再获取值:
class DataDispatcher { public: void set(DataContainer* dc) { dc_ptr = dc; } void dispatch() { // 这里已经保证是float,get不会返回nullptr float& val = boost::get<float>(dc_ptr->value); importantCalculation(val + 5); } private: DataContainer* dc_ptr; };
这个办法更安全,毕竟你已经保证了dispatch时variant是float类型,既避免了悬空指针风险,也不用提前修改variant的状态。
为什么原代码不行
Boost.Variant同一时间只有一个活跃类型,当它是std::string时,float对象根本没被构造,boost::get<float>自然返回nullptr。哪怕你能硬拿到内存地址,后续切换类型时,string会被销毁、float会被构造,但这种内存复用是Boost的内部实现细节,标准不做承诺,依赖它会导致未定义行为,绝对不能这么干。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

