是否有任何方法来恢复打包到boost :: any对象的类型?如果现在,我可以存储一些关联地图吗?我需要类似(伪代码):恢复任何类型
map<key, any> someMap;
someMap["Key"] = some own object;
getType("Key");
是否有任何方法来恢复打包到boost :: any对象的类型?如果现在,我可以存储一些关联地图吗?我需要类似(伪代码):恢复任何类型
map<key, any> someMap;
someMap["Key"] = some own object;
getType("Key");
不能随意,你需要有你想用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
或多态类。
您是试图获取值的类型,还是只是将其转换回它是什么?如果你只是想施展,只需要使用boost::any_cast
:
boost::any val = someMap["Key"];
RealType* r = boost::any_cast<RealType>(&val);
我不知道那种真正的类型。在任何地图中都存储有不同的数据。我应该恢复每种类型。 – Ockonal 2010-06-20 15:32:01
您需要(a)知道要恢复的类型; (b)有办法确定你想恢复的类型;或者,(c)通过尝试每种可能的方法来猜测你想要恢复的类型。所有可能的类型是否都来自一个公共基类? – 2010-06-20 15:39:56
比方说,你确实有这样一个函数来从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++中使用的通用接口。
另外一些有关联的地图呢?像键 - >类型,键 - >值。 – Ockonal 2010-06-20 15:38:30
@Ockonal:问题依然存在,你必须显式处理可能存储的不同类型 - C++没有*“运行时鸭式打字”*。 'any'已经有了类型信息,你只需要明确地采取行动就可以了。 – 2010-06-20 15:41:12