2010-06-20 30 views
0

是否有任何方法来恢复打包到boost :: any对象的类型?如果现在,我可以存储一些关联地图吗?我需要类似(伪代码):恢复任何类型

map<key, any> someMap; 
someMap["Key"] = some own object; 
getType("Key"); 

回答

0

不能随意,你需要有你想用C一起工作的一些静态类型++。

所以,你可以测试或转换为特定类型的使用any::type()any_cast(),如:

const boost::any& any = someMap["Key"].type(); 
if (int* i = boost::any_cast<int>(&any)) { 
    std::cout << *i << std::endl; 
} else if (double* d = boost::any_cast<double>(&any)) { 
// ... 

但像一般不能做,由于到C以下++进行静态类型:

magically_restore_type(someMap["Key"]).someMethod(); 

在C++中使用类似boost::any的东西几乎总是不是一个好主意,完全是因为处理任意类型并不好玩。如果您只需要处理已知的有限类型集,请不要使用boost::any - 有更好的选项,如boost::variant或多态类。

+0

另外一些有关联的地图呢?像键 - >类型,键 - >值。 – Ockonal 2010-06-20 15:38:30

+0

@Ockonal:问题依然存在,你必须显式处理可能存储的不同类型 - C++没有*“运行时鸭式打字”*。 'any'已经有了类型信息,你只需要明确地采取行动就可以了。 – 2010-06-20 15:41:12

0

您是试图获取值的类型,还是只是将其转换回它是什么?如果你只是想施展,只需要使用boost::any_cast

boost::any val = someMap["Key"]; 
RealType* r = boost::any_cast<RealType>(&val); 
+0

我不知道那种真正的类型。在任何地图中都存储有不同的数据。我应该恢复每种类型。 – Ockonal 2010-06-20 15:32:01

+0

您需要(a)知道要恢复的类型; (b)有办法确定你想恢复的类型;或者,(c)通过尝试每种可能的方法来猜测你想要恢复的类型。所有可能的类型是否都来自一个公共基类? – 2010-06-20 15:39:56

0

比方说,你确实有这样一个函数来从boost :: any中提取正确类型的提取。这个函数的返回值是什么?你的代码是什么样的?

// Extracts v and returns the correct type... except we can't do that in C++. Let's just call it MagicalValue for now. 
MagicalValue magic(const boost::any& v); 

void perform_magic(const boost::any& v) 
{ 
    MagicalValue r = magic(v); 
    r.hello_world(); // Wait, what? 
} 

在静态类型的语言中,你不能这样做。你可以尝试的是多态而不是boost :: any。这给你一个你可以在C++中使用的通用接口。