草庐IT

c++ - 它是 constexpr 从中间派生类引用访问基类成员吗?

structroot{inti=0;};structbase:root{};structderive:base{};constexprderived0;intmain(){constexprauto&r=static_cast(d0);constexprauto&b=static_cast(r);constexprauto&d=static_cast(r);static_assert(d0.i==0,"");//okstatic_assert(r.i==0,"");//okstatic_assert(b.i==0,"");//erroringccstatic_assert(d.i==0

c++ - 避免虚拟基类的显式构造函数调用

基本问题:是否可以避免显式调用每个虚拟基类的(非默认)构造函数?背景:我正在围绕WindowsCOM对象开发一些类型安全的C++包装器类。我目前的方法是有一个CBaseCOMWrapper封装IUnknown的类用于引用计数的对象。然后,我有一个CCOMWrapper继承自CBaseCOMWrapper的模板类,它为特定的COM类型定义了一个包装器(即IDXGIObject、ID3D11Device等)。最后,单独的类继承自这些包装器模板以提供实际/额外的功能(即CDXGIObject、CD3D11Device)。例如我有以下类(成员省略):classCBaseCOMWrapper{}

c++ - std::bind 和对基类方法的非虚拟调用

我想使用std::bind并对基类函数进行非虚拟调用,例如:derived_obj.BaseClass::foo()示例:假设我有基类A和派生类B。A有一个虚函数foo()被B覆盖。classA{public:virtualvoidfoo(){std::cout如果我想从类B的对象调用A::foo()我会进行非虚拟调用:Bb_obj;b_obj.A::foo();//prints"HellofromA::foo()!"现在我想使用std::bind并从b_obj对A::foo()进行非虚拟调用,我该怎么做?我已经尝试将b_obj转换为A并使用&A::foo()的地址,但没有成功。aut

c++ - 为什么派生类中有模板名(基类是模板的实例)?

我遇到了这段代码(使用基本类型进行了简化):templateclassBase{Tt;};classDerived:publicBase{public:usingBase::Base;};intmain(){Derived::Basex;printf("%lu\n",sizeof(x));return0;}它编译并工作(输出为8,这是longlong的大小)。看来我可以得到Base对于任何类型T使用Derived::Base,即使Derived只是Base的一个子类.(在我遇到的代码中,Base本身对main不可见。)但是,我不太理解这种语法及其工作原理。是Derived::Base模

c++ - 可以通过在基类中声明复制构造函数/运算符私有(private)来使派生类不可复制吗?

我认为理论上这个问题的答案是肯定的。然而,在实践中,我的编译器(VS2010)似乎并没有在以下情况下提示:我有一个抽象基类提供一些公共(public)接口(interface)(但没有数据成员)和从它派生的各种子类和子子类。classBase{public:Base(){}virtual~Base(){}virtualvoidinterfaceFunction1()=0;virtualvoidinterfaceFunction2()=0;private:Base(constBase&);//allderivedclassesshouldbeuncopyableBase&operator

c++ - 在常见基类型系列中获取整数类型 ID 的最有效方法

问题:我有一系列具有共同基础的对象,我需要能够通过整数值识别特定的具体类型。有两种明显的方法可以做到这一点,但是两者在内存或CPU时间方面都有NotAcceptable开销。由于该项目处理数十亿个对象,因此最小的开销最终会非常明显,我已经对此进行了测试,这不是过早优化的情况。处理对象所涉及的操作都是微不足道的,虚拟调用的开销极大地降低了性能。纯虚inttype()为每种类型实现的函数,不幸的是伴随着虚拟调用的开销,比如返回一个静态整数值inttype每个实例的成员,在构造函数类型中指定,这为这数十亿个对象中的每一个引入了4字节的开销,浪费了内存,污染了缓存等等我记得前段时间有人问“静态

c++ - 如何在编译时检测基类的模板参数(错误)?

我一直在使用Curiouslyrecurringtemplatepattern一般代码如下所示:templatevoidgenericFunction(T&);templatestructFunctionality{voidgenericMethod(){genericFunction(*((T*)this));}};structKlass:publicFunctionality{};voidmain(){Klassobj;obj.genericMethod();}templatevoidgenericFunction(Klass&obj){//dostuffwithKlass&obj

C++ 无法从派生类中调用基类方法

这是我的第一个问题,我希望我做的一切都是正确的。我尝试从boost元组派生一个类。Boost的元组提供了一个get()模板方法来访问各个字段。有趣的是,我不能使用派生类中的方法。以下代码显示了问题:#include#includeusingnamespacestd;templateclassDerived:publicboost::tuple{public:Derived():boost::tuple(){}A&getVal0(){returnget();//doesnotcompile://error:'get'wasnotdeclaredinthisscopereturnboost

C++ 基类引用用不同的派生类对象初始化

classBase{public:voidoperator()(){func();}private:virtualvoidfunc(){}};classDerived1:publicBase{private:voidfunc()override{/*dosomething*/}};classDerived2:publicBase{private:voidfunc()override{/*dosomethingelse*/}};因为我想使用运算符重载,引用是比指针更好的选择。我打算做的是:if(condition){Base&obj=Derived1();}else{Base&obj=D

C++ 将派生类作为基类模板参数传递

我在传递派生自BaseObject的类DerivedObject(派生自模板类BaseClass的类DerivedClass的一部分)时遇到问题(模板类BaseClass的一部分)作为模板类BaseClass的模板参数。这样,基类和派生类都可以访问包含派生对象的对象池。这听起来有点令人困惑,下面是示例:templateclassBaseClass{protected:classBaseObject{//Classimplementation}voidfoo(){static_cast(this)->foo();}std::vectorm_objectPool;};以上是基类实现erro