为什么没有提升::任何有"getter"?

Why doesn't boost::any have a "getter"?

本文关键字:任何 getter 为什么      更新时间:2023-10-16

使用boost::any是非常有用的,但是它没有getter是非常令人沮丧的,并且我们总是必须使用any_cast来将其转换为我们想要的类型。但是为什么它没有这样的东西呢?在我看来,下面的人可以是有用的成员。是不是有我看不到的坏事?

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

我看到的唯一不好的地方是,这个getter需要赋值操作符

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

get函数对失效条件不太清楚。我通常不会期望简单命名为get 的函数能够失败。如果有,我也不确定它的语义。

如果你想要一个get函数,也许你应该用boost::variant代替。

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

这可能会使您损失半小时的调试时间。