usingboost::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
。
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
这可能会让你失去一些半小时的调试时间。