Questions tagged «casting»

强制转换是一个过程,其中如果允许转换,则将对象类型显式转换为另一种类型。此过程可能会导致价值变化。





8
高效的无符号到无符号转换避免实现定义的行为
我想定义一个函数,该函数接受unsigned intas作为参数,int并向该参数返回全模UINT_MAX + 1。 第一次尝试可能看起来像这样: int unsigned_to_signed(unsigned n) { return static_cast<int>(n); } 但是,正如任何语言律师所知,对于大于INT_MAX的值,从无符号转换为有符号是由实现定义的。 我要实现这一点,以便(a)仅依赖规范要求的行为;(b)它可以在任何现代机器和优化的编译器上编译为no-op。 至于奇异的机器...如果没有符号的int与未签名的int模UINT_MAX + 1一致,那么我想抛出一个异常。如果不止一个(我不确定这是可能的),那么我要最大的一个。 好,第二次尝试: int unsigned_to_signed(unsigned n) { int int_n = static_cast<int>(n); if (n == static_cast<unsigned>(int_n)) return int_n; // else do something long and complicated } 当我不使用典型的二进制补码系统时,我不太关心效率,因为我的拙见认为这不太可能。而且,如果我的代码成为2050年无处不在的符号幅度系统的瓶颈,那么我敢打赌,有人可以弄清楚这一点,然后对其进行优化。 现在,第二次尝试非常接近我想要的。尽管强制转换int为某些输入的实现定义,但是unsigned标准保证了强制转换为保留对UINT_MAX + 1取模的值。因此,条件条件确实会检查我想要的内容,并且在任何可能遇到的系统上,它都不会编译成任何东西。 但是...我仍然在int不首先检查它是否将调用实现定义的行为的情况下进行投射。在2050年的某个假设系统上,它可以做谁知道什么。所以说我要避免这种情况。 问题:我的“第三次尝试”应该是什么样的? 回顾一下,我想: 从unsigned int转换为signed int …

4
将shared_ptr <Derived>作为shared_ptr <Base>传递
将shared_ptr派生类型的a传递给采用shared_ptr基本类型的a的函数的最佳方法是什么? 通常,我shared_ptr通过引用传递s以避免不必要的复制: int foo(const shared_ptr&lt;bar&gt;&amp; ptr); 但是如果我尝试做类似的事情这是行不通的 int foo(const shared_ptr&lt;Base&gt;&amp; ptr); ... shared_ptr&lt;Derived&gt; bar = make_shared&lt;Derived&gt;(); foo(bar); 我可以用 foo(dynamic_pointer_cast&lt;Base, Derived&gt;(bar)); 但这似乎不太理想,原因有两个: 一个dynamic_cast似乎有点过度了一个简单的衍生到基础施法。 据我了解,dynamic_pointer_cast创建指针的副本(尽管是临时的)以传递给函数。 有更好的解决方案吗? 后代更新: 原来是缺少头文件的问题。另外,我在这里尝试执行的操作也被视为反模式。通常, 不影响对象生命周期的函数(即对象在函数持续时间内保持有效)应采用简单的引用或指针,例如int foo(bar&amp; b)。 占用对象的函数(即给定对象的最终用户)应采用unique_ptr按值,例如int foo(unique_ptr&lt;bar&gt; b)。std::move调用者应将值放入函数中。 延长对象寿命的函数应采用shared_ptr按值,例如int foo(shared_ptr&lt;bar&gt; b)。避免循环引用的通常建议适用。 有关详细信息,请参见Herb Sutter的“基础知识”演讲。

7
const_cast安全吗?
我找不到有关的太多信息const_cast。我可以找到的唯一信息(堆栈溢出)是: 将const_cast&lt;&gt;()用于添加/可变的删除常量(岬)(或挥发性岬)。 这让我感到紧张。可以使用const_cast导致意外行为的行为吗?如果是这样,该怎么办? 或者,什么时候可以使用const_cast?

3
在Swift中将CGFloat转换为Float
我需要将值存储为Float,但是源数据是CGFloat: let myFloat : Float = myRect.origin.x 但这会导致编译器错误:“ NSNumber”不是子类型“ Float” 因此,如果我明确地将其像这样进行投射: let myFloat : Float = myRect.origin.x as Float 但这反过来导致编译器错误:'无法将表达式的类型'Float'转换为'Float' 请问满足编译器要求的正确方法是什么?
91 casting  swift  cgfloat 


8
将物件投放至T
我正在用XmlReader.NET中的类解析XML文件,我认为编写通用的解析函数以通用方式读取不同的属性会很明智。我想出了以下功能: private static T ReadData&lt;T&gt;(XmlReader reader, string value) { reader.MoveToAttribute(value); object readData = reader.ReadContentAsObject(); return (T)readData; } 当我意识到时,这并不能完全按照我的计划进行。由于强制类型转换无法将a转换为数值类型,因此它会引发基本类型(例如int或)的错误。有什么办法可以让我的功能以修改后的形式出现?doublestring
90 c#  generics  casting 

9
(字符串)还是.toString()?
我有一个带有Object o参数的方法。 在这种方法中,我完全知道String在“ o”中存在一个不为空的值。无需检查或执行其他操作。我必须像对待String对象一样对待它。 只是好奇-更便宜的是-将其投放String或使用Object.toString()?还是按时间/ CPU /内存价格相同? 更新:该方法可以接受,Object因为它是接口的实现。无法更改参数类型。 而且根本不可能null。我只是想说我不需要检查它是否为空或为空。就我而言,总是有一个非空字符串。
89 java  casting 



10
转换与使用Convert.To()方法之间的区别
我有一个double对string值进行强制转换的函数。 string variable = "5.00"; double varDouble = (double)variable; 签入了代码更改,并且项目生成并显示以下错误: System.InvalidCastException: Specified cast is not valid. 但是,执行以下操作后... string variable = "5.00"; double varDouble = Convert.ToDouble(variable); ...该项目的构建没有任何错误。 铸造和使用Convert.To()方法有什么区别?为什么投射会抛出Exception而使用Convert.To()不?
87 c#  casting 


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.