草庐IT

c++ - 调用父构造函数时如何避免模板参数上的样板

假设我有一个带有很多模板参数的类,其中之一是使用CRTP的派生类:templateclassBaseFoo{public:BaseFoo(A&a){}};我想继承它:classDerivedFoo:publicBaseFoo{public:DerivedFoo(A&a):BaseFoo(a){}};是否有任何技巧可以避免提及所有显式模板参数?如果我仍然必须声明Derived作为模板参数也没关系。 最佳答案 如果基类是依赖的,只需使用派生类的名称并在其中查找基类名称。如果它不依赖,您可以将基类命名为不合格的,因为它在范围内。不需要所有

c++ - 我可以在这里避免模板递归吗?

我为元组写了一个for_each:templateenable_if_t::valuefor_each(Tuple&,F&&){}template::value>enable_if_t::value>=end>for_each(Tuple&t,F&&f){f(get(t));for_each(t,forward(f));}[LiveExample]但是Yakk'sanswertothisquestion给出了一个很好的例子,说明如何处理在所有tuple值上运行lambda非递归:namespacedetail{templatevoidfor_each_arg(F&&f,Args&&..

c++ - 使用 "branchy"开发模型避免不必要的重新编译

我正在使用Mercurial开发相当大的C++项目,从头开始构建大约需要30分钟(而增量构建非常快)。我通常会尝试在新分支中实现每个新功能(使用“hgclone”),并且我可能在白天开发了几个新功能,等待新功能分支的到来很快就会变得非常无聊建成。是否有任何方法可以以某种方式重用来自其他已构建分支的目标文件?附言在git中,同一个存储库中有命名的分支,这使得构建系统可以重复使用现有的目标文件,但是我更喜欢更简单的Mercurial独立分支模型... 最佳答案 我建议使用ccache作为一种加速编译(大部分)相同代码树的方法。它的工作方

c++ - 如何避免 c++ 中多态对象的 clone() 样板代码

如果我想在C++中克隆一个多态对象(即从其他类B派生的类A的实例),最简单的方法似乎是给B一个虚拟克隆成员函数,它必须被覆盖A看起来像这样A*clone(){returnnewA(*this);}我的问题是,我发现这种不必要的样板代码,因为如果想使用C++的运行时多态特性,这几乎总是需要的。如何规避?谢谢为什么我需要这个:我的用例可以抽象为以下示例:我有一个classIntegral,它计算某个函数的积分。这样做,他们有一个成员,它是指向classMathFunction的指针。这个抽象类包含一个纯虚函数evaluate,它接受一个参数。我想实现幂函数,我将创建一个classPowFu

c++ - 在 C++ 中,使用 #define 还是 const 来避免魔数(Magic Number)更好?

使用#define优于const(反之亦然)有哪些优点和缺点?当我读到有关糟糕的编程实践(尤其是魔数(MagicNumber))时,我发现自己更频繁地使用#define。一些问题突然出现在我的脑海中,例如:大量使用#define不好吗?是否占用内存空间?使用const会更快吗?我读了一些关于这个的内容,但我仍然不确定,据我所知:#define定义了一个宏(不确定宏是什么意思),它处理预处理。在处理代码之前,它将已定义关键字的所有实例替换为其他内容。另一方面,const是变量,其值不能在运行时中途更改。我能想到使用const的唯一原因是该值是否依赖于其他变量。例如:#definePI3.

c++ - 如何正确使用命名空间避免名称冲突?

我对C++命名空间的正确使用有点困惑。我很清楚它们如何帮助避免冲突(名称冲突),但是当涉及到using关键字时,我就不清楚了。我的意思是,假设我有一部分代码放入命名空间,并创建一个类,比如说namespacemy{classvector{...};}当然,当我使用它时,我不想一直输入my::vector,所以我希望usingnamespacemy。但是,我最终可能需要std命名空间中的一些东西,然后我希望同时使用usingnamespacestd,但这会让我回到最初的名称冲突问题.我知道可以只“导入”我需要的功能,比如usingstd::set,但在这种情况下,导入标准命名空间似乎很自

c++ - 避免 std::list 中的指针

我尽量避免有指针,而不是做std::list*>myList;voidaddElement(inta,intb){myList.push_back(newstd::pair(a,b));}我想我可以做类似的事情std::list>myList;voidaddElement(inta,intb){std::pairp(a,b);myList.push_back(p);}如果我对行为的理解正确,这应该存储对的拷贝,并在执行myList.clear()时自动删除它(与指针相反)。这是最好的方法吗?我可以期望编译器优化掉不必要的对象p吗? 最佳答案

c++ - 我可以避免超过 3 个级别的缩进吗?

在工作中,我最近为一个根据已发布规范实现的类编写了一个小于运算符,该类具有许多属性,其中六个属性用于唯一标识该类的一个实例。(为了这个问题,我们将这些属性称为a-f。)此外,这六个属性属于六种不同类型。我这样定义运算符:booloperator这当然打破了Linux内核的编码理念,“如果你需要超过3层的缩进,你就完蛋了,应该修复你的程序。”所以我的问题是,是否有更好的方法来定义此运算符,使其没有那么多级别的缩进? 最佳答案 你可以这样写这种字典序比较:if(lhs.a!=rhs.a)returnlhs.a您可以像这样用一次返回重写它

c++ - 在 C++ 中可以完全避免使用模板吗?

我的问题在最后一段中,(在我看来)需要一些解释性的设置。基本上,我想知道是否可以避免使用模板,而是让所有可能的模板类继承自一个基类,该基类声明您将使用的虚拟方法,其中包括一个用于内存分配的函数,在实现时,将返回一个指向派生(非基础)类型的指针。开始设置C++似乎没有“通用基类”的概念,一切都从中隐式派生;我想该类将像这样定义:classuniversal_base{};当然,既然我已经定义了它,我就可以让我所有的类都派生自它。然后,由于多态性,我传递的任何对universal_base的引用或指针都将与模板参数基本相同:templateclassC{T&x;intf(T&y);C(T&

c++ - 如何避免简单的递归模板类型定义

我有以下简单的问题:A类templateParser它定义了一个ModuleType作为Module.我想将解析器类型注入(inject)模块,以便能够从其中的解析器中再次提取几种类型。这很方便,因为Module中只需要一个模板参数。但是如果解析器需要一些在模块中定义的类型,例如OptionsType,问题就来了。,在Parser中访问它通过使用声明usingModuleOptions=...显然不适用于派生类的实例化ParserDerived.错误:error:notypenamed‘DType’in‘structParserDerived’usingDType=typenamePa