jjzjj

c++ - 如何从非多态虚基类向下转型?

有没有办法在不涉及虚函数的情况下从虚基类向下转型为派生类?下面是一些代码来演示我在说什么:structBase1{intdata;};structBase2{charodd_size[9];};structViBase{doublevalue;};structMostDerived:Base1,Base2,virtualViBase{boolok;};voidfoo(ViBase&v){MostDerived&md=somehow_cast(v);//butHOW?md.ok=true;}intmain(){MostDerivedmd;foo(md);}请注意,该代码仅用于演示。我的真

c++ - 计时代码 "C2440: ' <function-style-cast >' : cannot convert from ' _CR' to 'std::chrono::milliseconds' 中的一个奇怪错误

我偶然发现了一个奇怪的错误C2440:'':cannotconvertfrom'_CR'to'std::chrono::milliseconds'基本上相当于HowardHinnant'sanotherquestion中的代码.这应该在VisualStudio2012RC上编译吗?这个问题的原因是什么?修复或解决方法如何?我的目标只是创建一个简单的计时器(没什么太严肃的),所以如果存在这种效果,将采取点-以及其他实现线索。问题代码如下。用法:timers::stopwatchw;w.start();std::cout并且头文件是(为简洁起见省略了实现)namespacetimers{c

C++ 设计 : cast from base to derived class with no extra data members

我编写了很多处理消息协议(protocol)的代码。消息协议(protocol)通常会有一个通用的消息帧,可以从串行端口或套接字反序列化;该帧包含消息类型,消息负载必须根据消息类型进行处理。通常我会编写一组多态类,其中包含访问器方法和一个引用消息框架的构造函数。我突然想到,我可以直接从消息帧派生访问器类,然后从消息帧重新解释_cast到适当的访问器类,而不是根据对消息帧的引用构造访问器类。这使代码更加简洁并节省了一些字节和处理器周期。请参阅下面的(极其人为和浓缩的)示例。显然,对于生产代码,这一切都需要适当封装,转换成为派生类的成员,更好地分离关注点,并添加一些验证。为了把一个简明的例

带断言的 C++ static_cast

不幸的是,我必须在调用第3方库时执行缩小转换。我不想在我的发布版本中增加开销,所以将使用static_cast。但是,它是一个数组索引,因此如果它最终为负数,可能会带来一些乐趣。是否有某种方法可以仅在Debug模式下创建安全转换,以检查值以确保转换期间没有丢失?我能想到的唯一方法是使用宏,但我不想这样做。例如,在使用MSVC的发布和Debug模式下:intmain(){longlongll=std::numeric_limits::max();++ll;std::cout(ll);std::cout输出结果:2147483648-2147483648使用宏:templatetochec

c++ - dynamic_cast 不适用于非多态类型的原因

对于类B和派生类D:classB{intb;};classD:publicB{intd;};D*d=newD();B*b=dynamic_cast(d);上面的代码可以正常工作——这是一个简单的向上转换。我们确信无论b指向什么,它都有B类(子)对象。但是,B*b=newD();D*d=dynamic_cast(b);不会编译,即使b指向一个有效的D实例——因为基类不是多态的。所以只添加一个空虚方法就可以解决问题。重要的问题是为什么C++要求源类型是多态的?我找到的唯一解释是this,但它只是说“因为这就是它在内部实现的方式”——至少在我看来是这样)。设计dynamic_cast的人可能

c++ - 引用 static_cast 的引用和指向 static_cast 指针的指针的成本

对引用static_cast的引用是否与指向指针static_cast的指针具有相同的运行时间成本?例如classB;classA:publicclassB;Aobj;A&ref=obj;A*ptr=&obj;//1static_cast(ref);//2static_cast(ptr); 最佳答案 不,它们并不总是具有相同的成本。启用优化后,它们总是具有相同或非常接近相同的成本。如果您向上或向下转换继承层次结构,其中任何一个涉及多重继承,或者一个多态类继承自一个非多态类,然后指针的static_cast可能会产生condition

c++ - 在 shared_from_this() 中 boost weak_ptr_cast

我正在使用boost的共享指针,并使用enable_shared_from_this来启用返回指向this的共享指针。代码如下所示:classfoo:publicboost::enable_shared_from_this{boost::shared_ptrget(){returnshared_from_this();}}为什么shared_from_this会抛出weak_ptr_cast异常? 最佳答案 如果您在堆栈上声明了foo,那么就没有其他指向foo的共享指针。例如:voidbar(){foofooby;fooby.get

c++ - 检查引用上的静态转换

很久以前,我创建了一个以下模板,以便在我执行static_cast时得到一个断言,但类型不是我假设的类型:///performastatic_castassertedbyadynamic_casttemplateTypestatic_cast_checked(SourceTypeitem){Assert(!item||dynamic_cast(item));returnstatic_cast(item);}今天我想创建一个不仅适用于指针而且适用于引用的变体:///overloadforreferencetemplateType&static_cast_checked(SourceTyp

c++ - boost::lexical_cast 无法识别重载的 istream 运算符

我有以下代码:#include#includestructvec2_t{floatx;floaty;};std::istream&operator>>(std::istream&istream,vec2_t&v){istream>>v.x>>v.y;returnistream;}intmain(){autov=boost::lexical_cast("1231.2152.9");std::cout我从Boost收到以下编译错误:Error1errorC2338:Targettypeisneitherstd::istreamablenorstd::wistreamable这看起来很简单,

c++ - 向上转换时的隐式转换与 static_cast

假设我有三个类:A(母亲,抽象),B和C,A的child。所以B和C继承自A(公有继承)。我有一个指向A的指针列表,我用B或C的指针填充它。问题是:在进行转换/转换时,哪种风格是首选?classA{};classB:publicA{};classC:publicA{};B*objB=newB();C*objC=newC();std::listmyList;//OptionA:staticcastconversionmyList.push_back(static_cast(objB));myList.push_back(static_cast(objC));//OptionB:impli