草庐IT

weak-template-vtables

全部标签

c++ - 使用weak_ptr的观察者模式

我正在尝试从observerpattern编写一个安全的Subject类.我想知道使用weak_ptr是否是存储IObserver实例的最佳方式:IObserver实例在释放后无法使用。Subject类不保留应该释放的IObserver引用(lapsedlistenerproblem)。Subject类必须是线程安全的。很遗憾,我们的编码标准规定我们不允许使用boost。我想我前世是个坏人。幸运的是,我可以使用C++11(VisualStudio2012附带的)。这是一个示例Observer类。//Observerinterfacethatsupportsnotify()methodc

c++ - 多重或虚拟继承下的类的内存布局和vtable(s)?

我正在阅读“C++对象模型内部”,试图了解如何通过vtables实现多重和虚拟继承。(我非常了解单多态性)。当需要在虚拟继承期间或强制转换期间定位方法时,我很难理解究竟做了什么,因为要执行大量的偏移计算。是否有人能够帮助理解在多重继承或虚拟继承示例中如何使用多个vtable?如果我能理解布局和问题,我可能会更好地理解这个问题。 最佳答案 C++实现通常使用vtables来实现虚函数。vtable是指向函数的指针表。具有虚函数的类的每个对象都有一个指向包含该类所有虚函数地址的vtable的隐藏指针。在调用虚函数时,代码会计算函数指针在

c++ - 如何检查weak_ptr是否为空(未分配)?

有没有办法区分已分配(可能已过期)的weak_ptr和未分配的。weak_ptrw1;weak_ptrw2=...;我了解以下针对未转让或到期的检查,但是否有(更便宜的?)仅针对未转让的检查?if(!w.lock()){/*eithernotassignedorexpired*/} 最佳答案 您可以使用两次调用owner_before来检查默认构造的(空)弱指针是否相等:templateboolis_uninitialized(std::weak_ptrconst&weak){usingwt=std::weak_ptr;return

c++ 未定义对 vtable 的引用

我正在学习C++。我正在尝试做一个练习,我用一个函数定义一个纯虚拟类的几个实现。我在链接使用这些实现的类时遇到问题。==>BasicMath.h#includeclassBasicMath{};#endif//BASIC_MATH_H==>Operation.h#includeclassOperation{public:virtualvoidperform(std::vectorvec)=0;};#endif//OPERATION==>Sum.hvec);};#endif//SUM_H==>BasicMath.cpp#include#include#include"BasicMath.

c++ - 这个 "if e is a pack, then get a template name, otherwise get a variable name"是否有效?

我尝试构建一个不需要typename或template的案例,但仍会根据给定名称t生成变量或模板是否为函数参数包templatestructA{templatestaticvoidf(int){}};templatestructA{staticconstintf=0;};templateusingtype=int;templatevoidf(Tt){A...)>::f(1);}intmain(){f(1);}以上将引用staticconstint,并进行比较。以下刚好有Tt变成了一个包并制作f引用模板,但GCC也不喜欢templatevoidf(T...t){A...)>::f(1);

c++ - 绑定(bind)到一个weak_ptr

有没有办法std::bind到std::weak_ptr?我想存储一个“弱函数”回调,当被调用者被销毁时会自动“断开”。我知道如何使用shared_ptr创建std::function:std::functionMyClass::GetCallback(){returnstd::function(std::bind(&MyClass::CallbackFunc,shared_from_this()));}然而,返回的std::function让我的对象永远活着。所以我想将它绑定(bind)到weak_ptr:std::functionMyClass::GetCallback(){std

c++ - C++/编译: is it possible to set the size of the vptr (global vtable + 2 bytes index)

我最近发布了一个有关由于C++中的虚拟性而导致的内存开销的问题。答案使我了解了vtable和vptr的工作原理。我的问题如下:我在super计算机上工作,我有数十亿个对象,因此,由于虚拟性,我必须关心内存开销。经过一些措施,当我将类与虚函数一起使用时,每个派生对象都有其8字节的vptr。这一点一点都不能忽略。我不知道英特尔icpc或g++是否具有某些配置/选项/参数,以使用精度可调的“全局”vtable和索引而不是vptr。因为这样可以让我为2亿个对象使用2字节的索引(无符号shortint)而不是8字节的vptr(这样可以大大减少内存开销)。有没有办法用编译选项来做到这一点(或类似的

c++ - 链接错误 : undefined reference to `vtable for XXX`

这里有一些链接错误。我在网上找了,还是没找到问题。我该如何解决?g++test.cpp-otest/tmp/ccDfCj4N.o:Infunction`Interval::Interval()':test.cpp:(.text._ZN8IntervalC2Ev[Interval::Interval()]+0x9):undefinedreferenceto`vtableforInterval'/tmp/ccDfCj4N.o:Infunction`IntInterval::~IntInterval()':test.cpp:(.text._ZN11IntIntervalD0Ev[IntInt

c++ - vtable for .. 从编译错误 xcode 中引用

我在编译iPhone项目时遇到以下错误:"vtableforoned::MultiFormatUPCEANReader",referencedfrom:__ZTVN4oned23MultiFormatUPCEANReaderE$non_lazy_ptrinMultiFormatUPCEANReader.old:symbol(s)notfoundcollect2:ldreturned1exitstatus有人知道我该如何解决吗? 最佳答案 问题似乎是在MultiFormatUPCEANReader类中我声明了构造函数和析构函数,但没有

c++ - MSVC++ : template's static_assert is not triggered inside a lambda

更新2:这已在VS2019Preview16.1Preview1中得到修复。更新:我已在visualstudio.com提交错误报告.所以我开始研究C++的模板,当我试图阻止使用static_assert编译模板类时遇到了这个问题。基本上,static_assert错误在VS2017上使用C++语言标准:ISOC++17标准(/std:c++17)。我也在gcc-7上使用-std=c++17进行了尝试,并触发了错误。这是VS2017上的错误还是我遗漏了什么?代码示例:#include#include#includetemplateclassIntegralContainer{stati