草庐IT

weak_ptr_cast

全部标签

c++ - 使用值为 std::shared_ptr 的映射是否是具有多索引类列表的良好设计选择?

问题很简单:我们有一个类(class),成员有a,b,c,d...我们希望能够通过为a或b或c提供当前值来快速搜索(键是一个成员的值)并使用新值更新类列表...我想拥有一堆std::map>.1)这是个好主意吗?2)boostmultiindex是否在各个方面都优于这个手工制作的解决方案?出于简单性/性能方面的原因,PSSQL是不可能的。 最佳答案 BoostMultiIndex可能有一个明显的缺点,即它会尝试在集合的每次突变后使所有索引保持最新。如果您的数据加载阶段包含许多单独的写入,这可能会造成很大的性能损失。BoostMult

c++ - 将 shared_ptr 与多继承类一起使用

我有一个类继承了两个接口(interface):classMulti:publicIFoo,publicIBar{public:virtual~Multi();//FoopartvirtualvoidfooMethod();//...//BarpartvirtualvoidbarMethod();//...};不幸的是,这个类不能分解为每个接口(interface)的两个单独的类。事实上,在类实现中,这些实体(Foo和Bar)是紧密耦合的,但将来它们可能会分开。另一个类想要使用Multi类,有一个指向IFoo和IBar的指针:classClientClass{public:Client

c++ - 从 weak_ptr 泄漏原始指针的可移植 hack

我有一个由shared_ptr组成的对象结构,加上weak_ptr以避免循环。原始指针是不行的,因为boost::serialization在通过对象跟踪作为序列化时间进行反序列化时需要恢复共享指针和弱指针。对象生命周期模式很复杂(粒子模拟)但完全可以预测。每当我使用weak_ptr::lock()时,我确信指针仍然有效。通常,我使用lock().get(),因为我只需要在很短的时间内使用该对象。现在,lock().get()对性能有影响,因为它会增加共享计数(在lock()中),然后在不久之后减少它(临时shared_ptr被破坏)。这boost.develpost从2002年开始,

c++ - 从 int 到 shared_ptr 的隐式转换

考虑下面的代码:#include#includevoidf(std::shared_ptrsp){}templateautocall_f(FuncTypef,PtrTypep)->decltype(f(p)){returnf(p);}intmain(){f(0);//doesn'tworkforanyotherint!=0,thanks@Rupesh//call_f(f,0);//error,cannotconvertinttoshared_ptr}在main()中的第一行,整数0转换为std::shared_ptr和电话f(0)成功没有任何问题。但是,使用模板调用函数会使情况有所不同

c++ - std::weak_ptr:锁或 shared_ptr 构造函数?

似乎有两种方法可以暂时获取weak_ptr指向的资源的所有权:使用lock()将weak_ptr传递给shared_ptr构造函数这两者都会产生一个shared_ptr,如果weak_ptr为空并且锁返回一个nullptrshared_ptr构造函数抛出异常。所以问题是:什么时候应该使用一个或另一个?是否有与此相关的一般准则或最佳做法? 最佳答案 复制自http://en.cppreference.com/w/cpp/memory/weak_ptr/lockBoththisfunctionandtheconstructorofstd

c++ - 在编译时填充 std::array 和 const_cast 可能的未定义行为

已知std::array::operator[]由于C++14是constexpr,请参见下面的声明:constexprconst_referenceoperator[](size_typepos)const;但是,它也是const限定的。如果您想使用std::array的下标运算符以便在编译时为数组赋值,这会产生影响。例如考虑以下用户文字:templatestructFooLiteral{std::arrayarr;constexprFooLiteral():arr{}{for(inti(0);i如果您尝试声明类型为FooLiteral的constexpr变量,上述代码将无法编译。这

c++ - std::exception_ptr 线程安全吗?

我有一个工作线程,它通过std::thread持续运行、创建和管理。在我的工作线程的顶层,我有一个try/catchblock,里面有一个while循环。如果异常泄漏到线程的顶层,我会捕获它并将其存储在std::exception_ptr中,它是还拥有非静态线程函数的类的成员://Inclassheader(insideclassdeclaration)std::exception_ptrm_threadException;//InclassCPPfilevoidMyClass::MyThreadFunction(){try{while(true){//Dothreadstuff}}c

c++ - `std::any_cast` 返回拷贝

我正在阅读documentationforstd::any_cast我觉得很奇怪,API让转换要么返回一个值给持有的对象,要么返回一个指向它的指针。为什么不返回引用?每次使用非指针类型参数调用函数时都需要创建一个拷贝。我可以看到指针版本的转换可能更能表明意图,也可能更清晰,但为什么不让返回值成为这样的引用呢?templateValueType&any_cast(any*operand);代替templateValueType*any_cast(any*operand);此外,即使您请求引用,强制转换也会删除引用并将拷贝返回到存储的对象,请参阅此处对函数重载1-3的返回值的解释http:

c++ - 如何使用 boost::any_cast 转换为基本类型?

我正在使用boost::any来获得多态类型,我需要能够将对象转换为其基类型。classA{public:intx;virtualintfoo()=0;};classB:publicA{public:intfoo(){returnx+1;}};intmain(){B*bb=newB();boost::anyany=bb;bb->x=44;A*aa=boost::any_cast(any);}main函数的代码在运行时抛出如下错误:terminatecalledafterthrowinganinstanceof'boost::exception_detail::clone_impl>'w

c++ - 将对象传递给期望 shared_ptr 的函数而不实际共享所有权

首先,我确实意识到这完全违背了shared_ptr的目的。我正在处理一些库代码,其中ParticleSystem的实例希望在构造期间将shared_ptr传递给它们以设置用于每个粒子的纹理。问题是,我已经以我的纹理具有具体所有权(如果这是正确的术语)的方式构建了我的程序的其余部分-TextureCache拥有所有纹理。所以我需要一种方法来使用这个ParticleSystem类,而不允许它删除我的纹理。如果我只是创建一个像ParticleSystem(std::shared_ptr&myTexture)这样的新实例然后它会在纹理被破坏时尝试破坏它(这是一个不需要的和无效的操作,因为我的纹