虽然我有std::tr1::shared_ptr在我的编译器中可用,我不有make_shared.谁能告诉我如何正确实现make_shared?我懂了我需要使用可变参数来为T的构造函数提供参数。但我的编译器中也没有可用的可变参数模板。 最佳答案 如果您的编译器不提供make_shared的实现并且您不能使用boost,并且您不介意缺少针对对象和引用计数器的单一分配优化,那么make_shared是这样的:不支持可变参数模板://zeroargumentsversiontemplateinlineshared_ptrmake_shar
是否可以创建std::make_shared的boostphoenix惰性变体?我的意思是,让类似的事情成为可能namespacep=boost::phoenix;...expr=custom_parser[_a=p::make_shared(_1,_2,_3)]>>...由于std::make_shared的可变模板性质,不能使用BOOST_PHOENIX_ADAPT_FUNCTION。所以,如果可能的话,包装器应该是可变参数模板本身。 最佳答案 如果你能省下一组额外的括号:namespace{templatestructmake
具体来说:直接列表初始化(cppreference.com(3))。两者都是std::make_shared和统一初始化特性在C++11中被引入。所以我们可以在堆上分配对象时使用聚合初始化:newFoo{1,"2",3.0f}.这是一种直接初始化没有构造函数的对象的好方法,例如聚合、pod等。根据我的经验,现实生活中的场景(例如在函数中声明临时结构)以有效地向lambda提供参数集变得非常普遍:voidfoo(){structLambdaArgs{std::stringarg1;std::stringarg2;std::stringarg3;};autoargs=std::make_s
C++std::shared_ptr可能是空,也可能是null。这两个概念都存在,而且它们不是等价的。此外,这些情况之间的任何一种暗示都不总是正确的。后一种情况检测起来很简单,因为operatorbool恰好提供了那个测试。根据文档,它“检查*this是否存储了一个非空指针,即是否get()!=nullptr。”是否有针对前一种情况的测试,即事物为空的情况?我对此的使用非常简单。我有一个具有静态工厂方法的类。静态工厂方法里面是一个静态本地shared_ptr到类的一个实例,初始化为nullptr.对该工厂方法的第一次调用构造该类的实例并初始化静态本地shared_ptr在返回它的拷贝之
我在A中存储了一个类(我们称它为std::vector)使用C++智能指针(因此vector签名为std::vector>)。#include#include#includeclassA:std::enable_shared_from_this{public:voiddoWork();std::shared_ptrgetSharedRef();};voidA::doWork(){std::coutA::getSharedRef(){returnshared_from_this();}classAManager{staticstd::vector>aList;public:staticv
假设我有一个类是enable_shared_from_this的子类。这个基类的文档说在调用shared_from_this之前应该有一个拥有这个类的共享指针。使用new分配类并调用shared_from_this来管理对象是否安全? 最佳答案 正如其他用户已经提到的,在不属于shared_ptr的实例上调用shared_from_this将导致未定义的行为(通常是异常,但也有没有保证)。那么,为什么还要一个答案呢?因为我自己做了一次同样的问题并得到了几乎相同的答案,然后我开始为另一个问题而苦苦挣扎,这个问题紧随其后-我如何保证所有
我正在阅读ScottMeyers的EffectiveModernC++,他正在讨论pimpl习语的使用,并使用unique_ptr指向实现类,但存在特殊成员函数的问题(例如析构函数)要求类型完整。这是因为unique_ptr的默认删除器在使用deletep之前静态断言要删除的类型是否完整。因此类的任何特殊成员函数都必须在实现文件中定义(而不是由编译器生成),在实现类定义之后。在章节的最后,他提到如果使用的智能指针是shared_ptr,就不需要在实现文件中定义特殊的成员函数,这源于它支持自定义的方式删除器。引用:Thedifferenceinbehaviorbetweenstd::un
我正在使用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
我有一个类在一个公共(public)方法中创建一个对象。该对象是私有(private)的,对类的用户不可见。此方法然后调用同一类中的其他私有(private)方法并将创建的对象作为参数传递:classFoo{...};classA{private:typedefscoped_ptrFooPtr;voidprivateMethod1(FooPtrfooObj);public:voidshowSomethingOnTheScreen(){FooPtrfooObj(newFoo);privateMethod1(fooObj);};};我相信在这种情况下正确的智能指针将是一个scoped_pt
我有两个具有父子关系的类(客户&订单目录&文件等)我有typedefboost::shared_ptrParentPtr在父类中创建子类的方法我需要子实例有指向它们父实例的指针。classChild{....ParentPtrm_parent;....}我希望它是一个shared_ptr,这样在存在子项时父项不会消失。我还有其他人持有ParentPtrs给父级(Parents的工厂方法返回一个ParentPtr)问题:如何给child一个ParentPtr尝试(1)。在Parent::ChildFactorychild->m_parent.reset(this);这会导致非常糟糕的事情