草庐IT

c++ - decltype() 可变模板基类

我在期待decltype()的地方有以下代码不工作Derived上课得到run()基类方法返回类型,因为基类没有默认构造函数。classBase{public:intrun(){return1;}protected:Base(int){}};structDerived:Base{templateDerived(Args...args):Base{args...}{}};intmain(){decltype(Derived{}.run())v{10};//itworks.Notexpectedsince//Derivedshouldnothavedefaultconstructorstd

c++ - C++ 中的双重分派(dispatch)/多重方法

我有一个关于C++双重分派(dispatch)的问题。在下面的代码中,我希望第二组的结果与第一组的结果相匹配。我不知道实际类型(除非我尝试dynamic_cast)但我知道该对象继承自BaseClass类型。实现此目标的最有效(性能方面)方法是什么?在谷歌搜索了一段时间后,我发现了双重分派(dispatch)和loki多重方法。我在Shape示例中遇到的问题是,在我的应用程序中,Processor和BaseClass是完全独立的,并且没有它们可以相互调用的通用方法。其次,只有一个处理器(即没有任何东西继承自它)。感谢您的帮助。#include#includeusingnamespace

c++ - 有没有办法不继承子类中函数的 "virtualness"?

在C++中是否可以让一个类覆盖一个虚函数,但只有在通过父类(superclass)调用该函数时才具有虚拟分派(dispatch)(即,当它被静态类型为子类的东西调用时不存在)?我知道这不会发生,但有什么方法可以接近吗?想要这样做的原因是我有两个类都公开了一个flush()函数。在我的程序中的绝大多数时间,我直接在我知道类型的子类对象上调用flush(),因此我不需要虚拟分派(dispatch)。但是我想在混合中添加一个父类(superclass),这样我就可以很少将对任一类的实例的引用传递给doSomethingThenFlush()函数,该函数将调用flush()实际上。我知道我可以

c++ - 使用继承在 C++ 中调用析构函数和销毁成员变量的顺序是什么?

与这些问题非常相似,但不完全相同:WhatistheorderinwhichthedestructorsandtheconstructorsarecalledinC++Orderofmemberconstructoranddestructorcalls我想知道:派生类的成员变量是在调用基类的析构函数之前还是之后销毁的?这是在C++中使用VisualStudio2008。谢谢。 最佳答案 构造函数:先基后导出破坏:~派生~成员派生~基地~成员(member)群代码:classmember{strings;public:member(s

c++ - 覆盖派生类中的成员字段

下面是一段代码:#includeusingnamespacestd;classBase{public:Base():b(0){}intget();virtualvoidsayhello(){cout运行编译后的可执行文件,我发现在我的llvm-g++4.2机器上结果超出了我的预期。我盒子上的输出是HellofromDerivedwithb:10Derivedb:0HellofromBasewithb:0Baseb:0我想在代码中做的是覆盖Derived类中的成员字段(b)。由于我觉得Base和Derived都需要访问这个字段,所以我在Base中定义了一个get成员函数,因此Derive

c++ - 共享库中模板化类和 dynamic_cast 的显式实例化

今天我遇到了一个我似乎无法解决的问题。我正在编译一个共享库,其中包含一个模板化类(Derived,其基础是Base)和此类的一些显式实例化。我希望图书馆用户从这个模板化类中扩展。当我尝试dynamic_cast时出现问题来自Base*的用户实例至Derived*.我已经将问题缩小到这个MWE:共享库包含以下文件:Base.h#ifndefBASE_H_#defineBASE_H_classBase{public:Base();virtual~Base();};#endif/*BASE_H_*/Derived.h#ifndefDERIVED_H_#defineDERIVED_H_#inc

c++ - 从 void* 到基类指针的转换

我有一些层次结构:基类、派生类和一些将用户数据存储为void*的结构。该void可以存储Base和Derived类指针。主要问题是我不知道那里存储的是基指针还是派生指针。classBase{public:inttype;};classDerived:publicBase{};Base*base;//initbasepointerDerived*derived;//initderivedpointervoid*base_v=base;void*derived_v=derived;//voidpointersarecorrect.Theypointtobaseandderivedvaria

c++ - 重用 copy-and-swap 习惯用法

我正在尝试将copy-and-swap习惯用法放入可重用的混音中:templatestructcopy_and_swap{Derived&operator=(Derivedcopy){Derived*derived=static_cast(this);derived->swap(copy);return*derived;}};我打算通过CRTP将其混入:structFoo:copy_and_swap{Foo(){std::cout然而,一个简单的测试表明它不起作用:Foox;Fooy;x=y;这只会打印两次“default”,既不会打印“copy”也不会打印“swap”。我在这里缺少什

c++ - 仅在使用时如何在成员函数中进行静态断言?

我有以下方案:structBaz{};structQux{};structBase{virtual~Base(){}virtualvoidfoo()=0;};templatestructIdentity{staticboolconstvalue=false;};templatevoidbar(T){static_assert(Identity::value,"Busted!!!");}templatevoidbar(Baz){}templatestructDerived:Base{Tm;voidfoo(){bar(m);}};intmain(){Base*b0=newDerived;b

c++ - Clang 和 Intel 无法编译此 CRTP 代码

我编写了一个使用大量C++11元编程技术和CRTP的小型库,并且它在g++4.7.2下编译得很好现在,我尝试用Intelicpc13.0.0.079编译它,它产生了数百个错误。所以我尝试一个接一个地隔离问题。所以,首先,考虑这段代码,它在g++4.7.2下编译没有问题#includetemplateclassCrtp,typenameType>structBase{};templatestructDerived:publicBase{Derived():Base(){;}};intmain(){Derivedx;return0;}icpc和clang都无法编译这段代码:test_crt