为什么没有提升::任何有"getter"?
Why doesn't boost::any have a "getter"?
使用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
这可能会使您损失半小时的调试时间。
相关文章:
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 如何在不产生任何垃圾的情况下获得C中的像素
- 如何通过 getter 函数删除矢量的元素?
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- C++映射有2个键,这样任何1个键都可以用来获取值
- Visual Studio(或任何其他工具)能否将地址解释为调用堆栈(boost上下文)的开头
- RtlCaptureStackBackTrace未捕获任何帧
- 链表c++插入,所有情况都已检查,但没有任何工作
- C++模板函数,用于比较任何无符号整数和有符号整数
- 如何为 C 型字符串数组编写 getter 和 setter?
- Arduino millis() - millis() 怎么能等于 0 以外的任何东西?
- 尝试摆脱任何堆内存分配
- 是否有任何C++功能可以对地图进行排序?
- 打印时有二叉树问题.用户输入不打印任何内容
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 在C++行尾写一个分号或多个分号是否会改变任何内容
- 除了 setter 和 getter 之外的任何其他方法,它们将执行相同的功能但更好
- 为什么没有提升::任何有"getter"?