我正在尝试使用c++ 11中的boost::variant创建它,但是我不确定如何。所以我有了模板类数据的这种结构typedef boost::variant< data<A>,data<B>> dataVar;存储在std::map<string,dataVar> dataMap如果能以某种方式检索数据的类型,以便可以分配值,但我不知道如何优雅地完成此工作,那将是很好的void registerDataFor(string str) { auto itr = dataMap.find(str); if(itr == dataMap.end()) return; dataVar = itr->second; data<v.which()> itemData= boost::get<v.which()>(v); someArray.push_back(itemData.getIntegerValue()); registerDataFor(itemData.getString()); }由于模板括号需要静态类型,因此无法编译。我已经看到其他建议访客设计的答复,但是我还需要data 的类型来获取项目。 最佳答案 假设data<A>和data<B>具有相同的接口(interface),则可以将访客struct与template operator()结合使用:struct registerImpl : boost::static_visitor<void>{ template <typename T> void operator()(T& x) const { someArray.push_back(x.getIntegerValue()); registerDataFor(x.getString()); }};void registerDataFor(std::string str){ auto itr = dataMap.find(str); if(itr == dataMap.end()) return; registerImpl visitor; boost::apply_visitor(visitor, itr->second);} wandbox example在C++ 14中,您可以使用generic lambda来访问变体。void registerDataFor(std::string str){ auto itr = dataMap.find(str); if(itr == dataMap.end()) return; boost::apply_visitor([](auto& x){ someArray.push_back(x.getIntegerValue()); registerDataFor(x.getString()); }, itr->second);} wandbox example(如果您对使用lambda和C++ 14功能的变体访问感兴趣,我已经写了两篇关于它的文章:part 1和part 2。)关于c++ - 如何为模板化类检索boost::variant值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40913489/ 10-11 10:29