使用boost::any
非常有用,但是它没有getter非常令人沮丧,我们总是必须使用any_cast
将它转换为我们想要的类型。但为什么它没有这样的东西?在我看来,一个波纹管可能是有用的成员。是否有一些我看不到的坏事?
template <class T>
void get(T * handle)
{
*handle = boost::any_cast<T>(*this);
}
修改
我看到的唯一不好的事情是,这个getter需要有赋值运算符。
答案 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
这可能会让你失去一些半小时来调试。