草庐IT

weak_ptr_cast

全部标签

c++ - 使用 weak_ptr 实现观察者模式

我目前拥有的是:观察者.hclassObserver{public:~Observer();virtualvoidNotify()=0;protected:Observer();};classObservable{public:~Observable();voidSubscribe(std::shared_ptrobserver);voidUnsubscribe(std::shared_ptrobserver);voidNotify();protected:Observable();private:std::vector>observers;};观察者.cppvoidObservabl

c++ - "cast to first member of standard layout"类型双关规则是否扩展到数组?

具体来说,我将CAPI包装在一个友好的C++包装器中。CAPI具有这种相当标准的形式:structfoo{...};voidget_foos(size_t*count,foo*dst);我想做的是,通过将类型双关的包装器数组直接传递给Capi来为自己保存一个额外的拷贝,并保持理智检查static_assert().classfooWrapper{fooraw_;public:[...]};std::vectorget_foo_vector(){size_tcount=0;get_foos(&count,nullptr);std::vectorresult(count);//Isthis

c++ - C++ 标准中的什么措辞允许 static_cast<non-void-type*>(malloc(N));去工作?

据我了解5.2.9静态转换中的措辞,void*-to-object-pointer转换的结果唯一允许的时间是void*首先是反向转换的结果。在整个标准中有一堆对指针表示的引用,void指针的表示与char指针的表示相同,等等,但它似乎从来没有明确地说转换任意void指针会产生指向内存中相同位置的指针,具有不同的类型,就像类型双关未定义而不是双关一样对象的实际类型。因此,虽然malloc清楚地返回了合适内存的地址等,但据我所知,似乎没有任何方法可以移植地实际使用它。 最佳答案 C++0x标准草案在5.2.9/13中有:Anrvalue

c++ - 安全地将(shared_ptr 的 vector 到对象)转换为(shared_ptr 的 vector 到常量对象)

classA{};typedefshared_ptrAConstPtr;typedefshared_ptrAPtr;vectorptr;constvector*foo(){return&ptr;}此代码无法编译,因为“没有从vectorAptr>*到constvectorAConstPtr>*的隐式转换”有没有办法在不创建新vector且不使用不安全强制转换的情况下完成这项工作?我需要这个的原因是因为我有一个类在内部将列表存储为vectorAPtr>,但需要通过其接口(interface)公开它的一个完全const版本。 最佳答案

c++ - 将此 c-cast 更改为 reinterpret_cast 是否安全?

我正在尝试从我正在处理的一些代码中删除c风格的强制转换,但我担心唯一的选择。原代码为:WPARAMparam=(WPARAM)(GetDlgItem(IDC_WORKFLOW).m_hWnd);this->PostMessage(WM_NEXTDLGCTL,param,TRUE);如果我使用静态转换:WPARAMparam=static_cast(GetDlgItem(IDC_WORKFLOW).m_hWnd);this->PostMessage(WM_NEXTDLGCTL,param,TRUE);我收到错误“static_cast”:无法从“HWND”转换为“WPARAM”,因为基础

c++ - 为什么通过 weak_ptr 调用这么慢?

我已阅读问题What'stheperformancepenaltyofweak_ptr?但我自己的测试显示不同的结果。我正在使用智能指针创建委托(delegate)。下面的简单代码显示重现了weak_ptr的性能问题。谁能告诉我为什么?#include#include#include#include#include#include#includestructFoo{Foo():counter(0){incrStep=1;}voidbar(){counter+=incrStep;}virtual~Foo(){std::cout&g){constautost=std::chrono::hi

c++ - 如何使用 shared_ptr 并从 enable_shared_from_this 继承来制作克隆方法

我已经看到编写返回boost::shared_ptr的克隆方法的一种有用方法是做classA{public:shared_ptrClone()const{return(shared_ptr(CloneImpl()));}protected:virtualA*CloneImpl()const{return(newA(*this));}};classB:publicA{public:shared_ptrClone()const{return(shared_ptr(CloneImpl()));}protected:virtualB*CloneImpl()const{return(newB(*

c++ - 如何将 dynamic_cast 与 for_each 一起使用

我有以下代码:vector::iteratoritr=vec.begin();for(;itr!=vec.end();++itr){C2*c=dynamic_cast(*itr);c->f();}我想知道是否可以使用一行for_each来替换它。我尝试了以下方法:for_each(vec.begin(),vec.end(),bind2nd(mem_fun(&C2::f),dynamic_cast));但是我得到一个编译错误,expectedunqualified-idbefore'dynamic_cast'那正确的应该是什么?[编辑]我不能使用c++11。看来我必须定义一个额外的仿函数

c++ - RAII、unique_ptr 和输出参数

我是一名尝试学习C++11的C#开发人员。我正在尝试使用windns.h查询DNS。我从DnsQuery()开始,读到我需要使用DnsRecordListFree()释放结果记录输出参数。C#方法可能是使用try-finallyblock来确保我无论如何都释放资源。但我了解到没有finallyblock,并且windns.h确实应该与时俱进并实现RAII兼容接口(interface)(据我了解典型的建议)。我没有等待它发生,而是尝试制作一个RAII包装器类,其析构函数调用DnsRecordListFree()并使用运算符重载转换来获取原始指针。但我对如何正确使用此句柄或指针来获取输出参

c++ - 在不同限定的结构成员上使用 reinterpret_cast 是否安全?

我查看了以下相关的问题,但似乎没有一个能解决我的确切问题:one,two,three.我正在编写一个集合,其中的元素(键值对)与一些簿记信息一起存储:structElement{Keykey;Valuevalue;intflags;};std::vectorelements;(为简单起见,假设Key和Value都是标准布局类型。该集合无论如何都不会与任何其他类型一起使用。)为了支持基于迭代器的访问,我编写了覆盖operator->和operator*的迭代器,以向用户返回一个指针和一个引用,分别为键值对。但是,由于集合的性质,永远不允许用户更改返回的key。为此,我声明了一个KeyVa