如何检索模板化类的提升::变量值
How to retrieve a boost::variant value for a templated class
我正在尝试使用 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<A>
和data<B>
具有相同的界面,则可以使用带有template
operator()
的访问者struct
:
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);
}
魔杖盒示例
在 C++14 中,您可以使用通用 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);
}
魔杖盒示例
(如果您对使用 lambda 和 C++14 特征的变体访问感兴趣,我写了两篇关于它的文章:第 1部分和第2 部分。
相关文章:
- 使用变量值作为 PlaySound 中的路径
- 通过指针偏移量访问结构变量值
- 变量值在 C++ 中的 glutIdleFunc() 中未递增
- 更新 #ifdef 中的现有变量值?
- 尝试更改 main 函数内的全局变量值时出现编译错误 C++.
- 通过 Rcpp 和 bit64 R 包将最大的int64_t变量值从 C++ 传递到 R
- 如何使用 IRBuilder 更新 LLVM IR 中的全局变量值?
- 更改已在运行的程序的变量值
- 在 Xcode 中使用后对外部变量值进行初始化
- C++整数变量值
- 变量值,在三元运算符之后
- 如何获得对不同类的引用,以便从所述类内部获得变量值
- Java应用程序的JNI-c++变量值
- 如何固定从传感器获得的变量值
- 离开方法时重置变量值
- 打印具有通用特定变量值的类对象
- 在宏函数C++中设置宏变量值
- 为什么每次迭代都会获得相同的变量值? C++
- 如何根据基类对象中的变量值分配派生类中的变量?
- 如何检索模板化类的提升::变量值