恢复任何类型

时间:2010-06-20 15:24:58

标签: c++ types store

有没有办法将打包类型恢复为boost :: any对象?如果现在,我可以为它存储一些关联地图吗?我需要类似(伪代码)的东西:

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

3 个答案:

答案 0 :(得分:0)

您是在尝试获取值的类型,还是只是将其转换回原来的类型?如果您只是想要投射它,只需使用boost::any_cast

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

答案 1 :(得分: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或多态类。

答案 2 :(得分: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 ++中使用的通用接口。