草庐IT

production_cast

全部标签

c++ - 共享库中模板化类和 dynamic_cast 的显式实例化

今天我遇到了一个我似乎无法解决的问题。我正在编译一个共享库,其中包含一个模板化类(Derived,其基础是Base)和此类的一些显式实例化。我希望图书馆用户从这个模板化类中扩展。当我尝试dynamic_cast时出现问题来自Base*的用户实例至Derived*.我已经将问题缩小到这个MWE:共享库包含以下文件:Base.h#ifndefBASE_H_#defineBASE_H_classBase{public:Base();virtual~Base();};#endif/*BASE_H_*/Derived.h#ifndefDERIVED_H_#defineDERIVED_H_#inc

c++ - cast 运算符函数在 g++ 中编译良好,但在其他编译器中则不然。为什么?

这个问题在这里已经有了答案:Operatorcast,GCCandclang:whichcompilerisright?(1个回答)关闭6年前。考虑以下程序:structS{usingT=float;operatorT(){return9.9f;}};intmain(){Sm;S::Tt=m;t=m.operatorT();//Isthiscorrect?}程序在g++中编译良好(参见现场演示here)但它在clang++、MSVC++和IntelC++编译器中编译失败clang++给出以下错误(参见现场演示here)main.cpp:8:20:error:unknowntypenam

c++ - reinterpret_cast 更改指针值的任何真实示例?

根据C++标准,指针T*到其他类型指针Q*的reinterpret_castcanchangeornotchangethepointervalue取决于实现。我非常感兴趣-是否有任何真实的C++实现示例,其中使用reinterpret_cast将指针转换为其他指针类型会更改指针?那里发生了什么变化以及为什么发生变化? 最佳答案 请注意,当标准声明它可以或不能做某事时,并不意味着当前有任何实现具有该行为,只是它们可以。我能想到的最接近的是硬件要求类型对齐的架构,以及决定在需要时纠正对齐的实现。像这样的东西:aligned8var;al

c++ - static_cast 到相同类型会引入运行时开销吗?

我有一个结构模板,它采用两种类型(T和S),并且在某些时候使用static_cast从一种类型转换键入另一个。通常情况下,T和S是同一类型。设置的简化示例:templatestructfoo{voidbar(Tval){/*...*/some_other_function(static_cast(val));/*...*/}};在S与T是同一个类的情况下,static_cast是否会引入额外的开销,或者它是否为null哪个操作总是会被忽略?如果它确实引入了开销,是否有一个简单的模板元编程技巧来仅在需要时执行static_cast,或者我是否需要创建部分特化来处理T==S案例?如果可能,

c++ - c++ 中的复杂 dynamic_cast

我在C++中有以下情况:抽象基类Abstract1和Abstract2。它们是无关的。类Foo派生自Abstract1和Abstract2我在一个编译单元中,我没有关于类Foo的信息(没有声明,没有定义)。只有Abstract1和Abstract2是已知的。(实际上,Foo甚至定义在一个DLL中)dynamic_cast是否允许从Abstract1*转换为Abstract2*?这是标准吗? 最佳答案 你所描述的是所谓的cross-cast。对于dynamic_cast(v),标准在[expr.dynamic.cast]/8中指定If

c++ - 使用 std::dynamic_pointer_cast 向上转换 std::shared_ptr

我开始在C++0X/11中使用智能指针,但遇到了一个特殊情况。我想使用shared_ptr向上转换一个对象的实例。Extend类继承自Base类,其中Base类具有虚拟析构函数以使其具有多态性(否则dynamic_pointer_cast会提示非多态类转换)。如果因此:std::shared_ptrobj=std::make_shared();然后我做:obj=std::dynamic_pointer_cast(obj);安全吗?其他指向该对象的指针会怎样?是否只有obj将其视为Extend,而其他共享指针仍将其视为Base?向上转换同一实例是否安全,还是我应该做其他事情?编辑:感谢您

c++ - 断言中的 dynamic_cast 导致错误

我正在使用过时的VisualStudio2008(让我为您省去“这是您的问题”的麻烦。)这似乎是VisualStudio的问题:http://rextester.com/XKFR77690这似乎是assert的问题宏:http://ideone.com/bhxMi0给定这些结构:structbase{virtual~base(){}};templatestructFoo:base{Tfoo;};我能做到:base*test=newFoo>;if(dynamic_cast>*>(test)!=NULL)cout但是当我使用与if中完全相同的代码时-assert中的声明:assert(dy

c++ - 带有 const 指针的 boost::dynamic_pointer_cast 不起作用?

假设我有两个类,A和B,其中B是A的子类。我还有以下功能:voidfoo(boost::shared_ptra){boost::shared_ptrb=boost::dynamic_pointer_cast(a);//Error!}用gcc编译会出现以下错误:C:\Boost\include/boost/smart_ptr/shared_ptr.hpp:Inconstructor'boost::shared_ptr>::shared_ptr(constboost::shared_ptr&,boost::detail::dynamic_cast_tag)[withY=constA,T=c

c++ - 为什么 lexical_cast 要求运算符>>位于匹配的 namespace 中?

这是一个测试用例:#include#includenamespaceN{enumclassalarm_code_t{BLAH};}std::istream&operator>>(std::istream&is,N::alarm_code_t&code){std::stringtmp;is>>tmp;if(tmp=="BLAH")code=N::alarm_code_t::BLAH;elseis.setstate(std::ios::failbit);returnis;}intmain(){autocode=boost::lexical_cast("BLAH");}Boost拒绝转换,声

c++ - const_cast 的合法用途是什么

因为在const_cast的帮助下,任何人都可以修改我声明的常量对象-const限定符有什么用?我的意思是,有人怎么能确保他声明的const无论如何都不会被修改? 最佳答案 您是对的,const_cast的使用通常表示存在设计缺陷,或者API不受您的控制。但是,有一个异常(exception),它在重载函数的上下文中很有用。我引用了C++Primer一书中的一个例子://returnareferencetotheshorteroftwostringsconststring&shorterString(conststring&s1,c