为什么不提升::任何有“吸气剂”?

时间:2011-05-03 16:54:54

标签: c++ boost-any

使用boost::any非常有用,但是它没有getter非常令人沮丧,我们总是必须使用any_cast将它转换为我们想要的类型。但为什么它没有这样的东西?在我看来,一个波纹管可能是有用的成员。是否有一些我看不到的坏事?

template <class T>
void get(T * handle)
{
    *handle = boost::any_cast<T>(*this);
}

修改

我看到的唯一不好的事情是,这个getter需要有赋值运算符。

2 个答案:

答案 0 :(得分:5)

可能是因为它的行为与any_cast完全相同,但它的描述性较差。 any_cast表示您正在执行演员表,类型转换。您尝试any对象中获取值。因此,如果您使用错误的类型调用它,操作可能会失败,这一点很清楚。

get函数不太清楚失败条件。我通常不希望名为get 的函数能够失败。如果确实如此,我不确定它的语义。

如果您需要get功能,可能应该使用boost::variant代替。

答案 1 :(得分:2)

any_cast的要点是强迫人们使用模板参数演绎,因为演员表的失败与否对完全非常敏感用于建筑的类型。

这种用法很明确:

any x(2); // store an int
double f = any_cast<int>(x); // ok, request for an int, then cast to double

这个不是:

int g;
...
x.get(&g); // Ok. For now.

的确,现在想象一下你重构代码,然后替换

int g;

通过

double g;

现在,新代码看起来像

double g;
... // There can be 100s of lines here
x.get(&g); // This line HAS changed semantics and cast will fail

这可能会让你失去一些半小时来调试。