草庐IT

weak_ptr_cast

全部标签

c++ - 了解 shared_ptr 别名构造函数的原型(prototype)

shared_ptr别名构造函数的原型(prototype),形式为g++:templateshared_ptr(constshared_ptr&__r,element_type*__p)noexcept:__shared_ptr(__r,__p){}这里给出的例子是:shared_ptr>pii(newpair());shared_ptrpi(pii,&pii->first);行得通;一直有效。但是看看原型(prototype),_Yp是我们提供的用于实例化模板的模板参数,因此上面的最后一行感觉应该是:shared_ptrpi(pii,&pii->first);但是这个例子绝对是是正

c++ - 将 unique_ptr<Object> 作为 unique_ptr<const Object> 返回

我有这样的方法:std::unique_ptrTable::GetStats()const{std::unique_ptrresult;//...//Preparestats.Undersomeconditionsanexceptionmaybethrown.//...returnresult;}问题是它无法编译:error:cannotbind‘std::unique_ptr’lvalueto‘std::unique_ptr&&’我可以使用以下绕过方法使其编译:returnstd::unique_ptr(result.release());不过好像有点过分了。我无法理解,从C++的角

c++ - 将 shared_ptr 转换为 void*

我正在使用libev,它需要将我的数据转换为void*以符合其预定义的结构。我需要将boost::shared_ptr转换为void*,然后将void*转换回boost::shared_ptr。这是我执行此操作的代码voidfoo(boost::shared_ptr&a_string){void*data=(void*)a_string.get();boost::shared_ptrmyString((string*)data);}我很确定这工作正常,但是我的代码设置方式我相信所有对我的字符串的shared_ptr引用都超出了范围,因为这种转换方法不会增加use_count,因此sha

c++ - 大 vector 的返回值优化与 auto_ptr

如果我使用auto_ptr作为填充大vector的函数的返回值,这会使该函数成为源函数(它将创建一个内部auto_ptr并在返回非constauto_ptr时移交所有权)。但是,我不能将此函数与STL算法一起使用,因为为了访问数据,我需要取消对auto_ptr的引用。我猜一个很好的例子是大小为N的vector场,每个vector有100个分量。如果N很大,则函数按值或按ref返回每个100个分量vector是不一样的。此外,当我尝试这个非常基本的代码时:classt{public:t(){std::coutautoFun(){returnstd::auto_ptr(newt());}a

c++ - 避免 dynamic_cast 缓慢的著名解决方案?

我需要运行时多态性,所以我使用了dynamic_cast.但现在我有两个问题--dynamic_cast非常慢!(向下滚动基准。)长话短说,我最终以这种方式解决了问题,使用static_cast:structBase{virtual~Base(){}virtualinttype_id()const=0;templateT*as(){returnthis->type_id()==T::ID?static_cast(this):0;}templateTconst*as()const{returnthis->type_id()==T::ID?static_cast(this):0;}};st

c++ - const 正确性和 shared_ptr,设计问题?

我最近开始尝试在我的代码中强制执行const正确性。在函数定义中,我将常量指针提供给类LorentzM的常量对象。:voidAnalysisObject::SetOwnedPointer(constintmaptotree_In,constLorentzM*constmomentum_In){owned_pp4_original.reset(momentum_In);maptotree=maptotree_In;}哪里owned_pp4_original是shared_ptrowned_pp4_original;我这样做是因为这个函数SetOwnedPointer永远不应该改变Lore

c++ - std::vector<std::unique_ptr<T>> 有更好的替代方案吗?

我正在寻找需要满足以下要求的容器(针对游戏开发,尤其是实体管理):快速迭代没有存储元素的拷贝不会使指向元素的指针失效删除和插入元素例子:Containercontainer;//ThispointerwillalwayspointtotheplayerEntity*player{newEntity};container.add(player);//Setsomeentitiesto"dead"for(auto&e:container)if(e->type=="Enemy")e->die();//Useerase-removeidiomon"dead"entitiescontainer.

c++ - 在构造函数初始化列表上 move shared_ptr

最近我看到了几个这样的代码示例,其中std::move用于构造函数初始化列表(而不是move构造函数)。classA{public:A(std::shared_ptrres):myRes(std::move(res)){//...}private:std::shared_ptrmyRes;}我得到的信息是这个结构是出于优化原因而设计的。我个人尽可能少用std::move。我威胁他们作为Actor(正如斯科特迈耶斯所说),并且只在调用者代码中(唯一的异常(exception)是move构造函数)。对我来说,这看起来像是某种混淆或微优化,但也许我错了。如果没有std::move,编译器不会

c++ - 使用包含 std::unique_ptr 的结构的 std::vector 声明类时出错

虽然我已经使用C#工作了几年,但用C++完成工作有时对我来说仍然很困难。我完全接受智能指针的使用,但现在我面临以下难题我有一个结构Foo,例如structFoo{Foo(std::unique_ptrbar):m_myBar(std::move(bar)){}private:std::unique_ptrm_myBar;};在另一个类中,我想要一个包含Foo实例的vector,但是下面这行std::vectorm_Foos;产生编译错误,指出拷贝构造函数被删除。在SO线程“WhycanInotpush_backaunique_ptrintoavector?”中给出了解释和补救措施。但是

c++ - 是否有理由在此代码中的字符串文字上使用 const_cast ?

我正在查看我即将开始使用的API的一些示例代码。以下模式让我有点困惑:char*str;str=const_cast("HelloWorld");printf("%s",str);(实际上有一个巨大的case语句,其中str被分配给每个case。)请注意printf采用constchar*。这种复杂的转换有什么合理的目的吗?这段代码的作者在其他地方应用了许多以性能为导向的技巧,但没有解释这里发生了什么。我的直觉是将此代码更改为:constchar*str;str="HelloWorld";printf("%s",str);我错过了什么吗? 最佳答案