boost::any_cast - 仅在隐式转换不可用时抛出?
Posted
技术标签:
【中文标题】boost::any_cast - 仅在隐式转换不可用时抛出?【英文标题】:boost::any_cast - throw only when an implicit conversion isn't available? 【发布时间】:2008-11-25 22:42:32 【问题描述】:我希望 boost::any_cast<T>
仅在 any
的类型没有隐式转换为 T
时引发异常。如果any
的类型不是T
,正常的行为似乎是抛出异常,不管隐式转换。
例子:
boost::any a = 1;
boost::any_cast<int>(a); // This succeeds, and rightfully so
boost::any_cast<long>(a); // I don't want this to throw
boost::any_cast<Widget>(a); // I want this to throw
谁能告诉我是否有一种简单的方法来获得我想要的功能,或者更好的是给我一个很好的理由来解释为什么现有的行为是这样的?
【问题讨论】:
【参考方案1】:好吧,你不能这样做。 any
机制是这样工作的:
struct base
virtual ~base()
;
template<typename T>
struct concrete_base : base
T t;
concrete_base(T t):t(t)
;
struct my_any
base * b;
template<typename T>
my_any(T t):b(new concrete_base<T>(t))
template<typename T>
T any_cast()
concrete_base<T> * t = dynamic_cast< concrete_base<T>* >(b);
if(!t) throw bad_any_cast();
return t->t;
;
我希望上面的内容很清楚。我认为你不可能做你正在寻找的东西。原因是没有关于保留的类型的信息在这里可以证明是有用的。 RTTI 不提供。
【讨论】:
【参考方案2】:any_cast 不能这样做,但如果基类型和派生类型是完整的(它们通常用于层次结构中的类型),您可以实现自己的系统,该系统通过 throw 和 catch 进行转换,因为抛出一个指针可以将派生类型捕获为基指针类型。
【讨论】:
throw
和 catch
用于处理错误,而不是在别人的界面中故意限制。 (我不知道它们在这里是否必要/有用,但我知道这个想法/建议在任何情况下都是不好的。)如果有人想要一个具有隐式转换的类型擦除容器,那么他们应该编写他们的拥有。以上是关于boost::any_cast - 仅在隐式转换不可用时抛出?的主要内容,如果未能解决你的问题,请参考以下文章
在 c# 中,隐式短到字节是不可能的,但在隐式 int 到短时没有问题。源值始终与目标范围一致