草庐IT

weak-template-vtables

全部标签

c++ - 如何在 C++ 程序中查看 gdb 中的 vtable?

我的一个C++程序中有一个有趣的问题。显然,我的一个类的vtable在程序执行期间被/变得困惑了。在gdbsession中,我发现如果我直接调用对象的方法它会成功,但如果我使用指针或引用,我最终会进入一个完全不相关的类的析构函数,该类不会很快被实例化。没有this-指针当然会改变。假设我的观察是正确的,我如何在gdb中查看对象的vtable?我在Linux上使用gcc,我的gdb版本是GNUgdb(Ubuntu/Linaro7.3-0ubuntu2)7.3-2011.08。 最佳答案 您可以使用gcc的-fdump-class-hi

C++ 性能 : template vs boost. 任何

我想知道在任何可以使用模板的地方使用boost.any(没有RTTI)类是否会减慢程序速度。由于boostany实际上是模板类的包装器,可以说现代编译器优化会产生相同的效果,对吗?tpl_vs_any.hpp#include#includeusingnamespacestd;templateclasstpl{Tcontent;public:tpl(constT&value):content(value){}operatorT()const{returncontent;}};classany{public:any():content(0){}any(constany&other):con

C++ 继承 : Templates Vs Pointers

我试图了解在继承场景中指针和模板之间的最佳解决方案是什么。考虑以下类。classEvent{};classFilter{public:virtualvoidprocess(Event*event)=0;};classPipeline{private:std::vector_filters};每个用户都可以扩展Event类和Filter类来保存实际数据和实际过滤功能。管道类只是将过滤器与队列连接在一起并执行方法过程。到目前为止,我一直使用指针来处理继承,例如过滤器指针的std::vector和接收事件指针的过程函数。可以使用模板代替指针吗?例如classEvent{};templatec

c++ - 获取没有对象的类的vtable

我正在尝试实现类似于thefirstdescribedhere的系统.也就是说,(ab)使用vtable修改来在运行时更改对象行为。这是我在我正在处理的C++项目中创建高效类型通用包装器的尝试的一部分。如果您无法访问该示例,则使用memcpy()和this指针复制vtable:voidsetType(constDataType&newType){memcpy(this,&newType,sizeof(DataType));}但是,我对这种方法有一个问题:我没有目标类的对象来从中复制vtable,并且不想创建一个,因为某些类型的构造成本很高。有没有办法在没有该类对象的情况下访问将被放置到

c++ - `template <class> friend class Foo` 是什么意思?

我正在探索boost::iterator_facade并遇到了这段代码:friendclassboost::iterator_core_access;templatefriendclassIterator;第二行是什么意思?我熟悉friend类,但我想我没见过template在任何事情之前。这里是上下文:templateclassnode_iter:publicboost::iterator_facade,Value,boost::forward_traversal_tag>{public:node_iter():m_node(0){}explicitnode_iter(Value*p

c++ - 从 shared_ptr 到 weak_ptr 多态性的转换

我很难解决这个问题。假设我有这个vectorstd::vector>cars;Car是一个抽象类。我希望能够返回不同类型的弱指针,所以我执行以下操作。templatestd::weak_ptrGetCar(){for(std::vector>::iteratorit=cars.begin();it!=cars.end();++it){T*derived=dynamic_cast((*it).get());if(derived!=nullptr){std::weak_ptrcarPointer=*it;returncarPointer;}}returnstd::weak_ptr();}但

c++ - 错误 : class template partial specialization contains a template parameter that cannot be deduced

我很感激帮助弄清楚我的代码中出现的这个问题是怎么回事,我已将其简化为以下内容:typedefunsignedshortushort;templatestructFoo{};//Specialization--workswhennotaspecializationtemplateclassContainer,templateclass>classMetaFunction>structFoo::Type>>{//typedefContainer::Type>TestType;//OK};intmain(){}在编译(gcc5.4.0)时出现错误:Test.cpp:14:8:error:te

c++ - 防止派生析构函数中的 vtable 数据竞争

假设我有以下代码#include#include#includestructFooBase{voidstart(){run_condition_=true;t_=std::thread([this](){thread_handler();});}virtual~FooBase(){run_condition_=false;if(t_.joinable())t_.join();}protected:virtualvoidthread_handler()=0;std::atomic_boolrun_condition_{false};private:std::threadt_;};stru

c++ - 如何使这个 "template/constexpr"构造更优雅/更简洁?

我有这个伪位域实现:classField{public:constexprField(inti,ints):index(i),size(s){}constexprField(constField&prev,ints):index(prev.index+prev.size),size(s){}intindex,size;};#defineFIELD(name,i,s)constexprstaticconstFieldname={i,s};templateclassFlags{public:Flags(Td=0):data(d){}inlineTreadField(constField&f

C++ : using index as template parameter in for loop

给定以下模板和特化enumCountryName{Armenia=0,Georgia,Size=2};templateclassCountryInfo;templateclassCountryInfo{/*CODEHERE*/};templateclassCountryInfo{/*CODEHERE*/};我想遍历枚举并为每个特化创建对象。main(){for(autoi=0;i(i))>();}}我收到以下错误:错误:“i”的值在常量表达式中不可用国家信息(); 最佳答案 您想要的是将运行时变量转换为编译时变量(这是模板参数的要求