2

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

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

编辑:

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

4

2 回答 2

5

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

功能get对故障条件不太清楚。我通常不会期望一个简单命名的函数get 失败。如果是这样,我不确定它的语义。

如果你想要一个get函数,也许你应该使用它boost::variant

于 2011-05-03T17:00:09.117 回答
2

with 的重点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

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

于 2011-05-17T10:40:49.073 回答