草庐IT

c++ - 如何通过更好的抽象来避免 typeid?

我在我的代码中使用了typeid,但在我看来,如果我避免使用typeid,代码会更清晰。如果我们要存储类的类型,为什么我们首先要选择面向对象的语言呢?但我一遍又一遍地看到这种模式,我不知道如何避免它。所以我在想是否可以通过更好的抽象将这段代码写得更干净?代码如下:classA{public:stringtype;};templateclassB:publicA{public:B(){type=typeid(T).name();}};classRegistry{private:std::vectorlist;public:voidappend(A*a){intfound=0;for(A*

c++ - 如何避免重复使用 "indices trick"?

我有一个名为memory_region的类,有点像未类型化的gsl::span(即它本质上是一个void*和一个size_t),我也将其用于类型删除。因此它有一个as_span()方法。对于这个类,我有一个std::unordered_mapmy_map-它用于在我的不共享header的代码部分之间传递类型删除的跨度,因此它们无法了解彼此的类型。对其中之一的典型访问如下所示:autofoo=my_map.at("foo").as_span();这对于具有一组固定缓冲区、类型和名称的代码来说效果很好。但是-当我的代码缓冲区依赖于模板参数包时,事情就变得棘手了。现在,我实现了一个std::

c++ - gcc:通过显式 memcpy 避免严格别名违规警告

我有一个占用64位内存的类。为了实现平等,我使用了reinterpret_cast,但它会在gcc7.2(但不是clang5.0)上导致此警告:$g++-O3-Wall-std=c++17-g-cexample.cppexample.cpp:Inmemberfunction‘boolX::eq_via_cast(X)’:example.cpp:27:85:warning:dereferencingtype-punnedpointerwillbreakstrict-aliasingrules[-Wstrict-aliasing]return*reinterpret_cast(this)=

c++ - 在类的构造函数中初始化映射时如何避免内存泄漏?

我想在一个类的构造函数中初始化一个(指向一个)map的指针。我编写的程序可以编译,但由于段错误而在运行时失败。我可以通过为map动态分配内存来解决问题,但是Valgrind通知我内存泄漏。如何正确初始化类?举个例子#include#include#include#includeclassMemoryLeak{public:MemoryLeak(std::vector&inp){inti=0;std::map*tmp=newstd::map;for(std::string&s:inp){//(*problem_map)[s]=i++;//Line12:causesasegfault(*t

c++ - 避免使用 std::unordered_map(和其他)进行双重搜索或不必要的构造

我想在std::unordered_map上找到一个带有键的元素,或者如果它不存在则插入它。来自cppreference.com:std::unordered_map::emplaceInsertsanewelementintothecontainerconstructedin-placewiththegivenargsifthereisnoelementwiththekeyinthecontainer....Theelementmaybeconstructedeveniftherealreadyisanelementwiththekeyinthecontainer,inwhichca

c++ - 定义静态全局数组以避免在函数中定义它

我刚刚开始使用作者声称“高度优化”的代码块。在某些时候他们会这样做:namespacesomename{staticfloatarray[N];}floatSomeclass::some_function(std::vector&input){//usesomename::arrayinsomewayreturnresult;}作者没有将somename::array包含在类中,因为持久性代码存在问题(我们几乎无法控制)。当调用some_function时,该类对数组执行O(N^2)次操作。所以如果我在函数调用中移动array,floatSomeclass::some_function

c++ - 规范化时避免奇怪的单应性值

熟悉单应性的人会知道,为了保持齐次坐标,您必须对其除以任何矩阵分量进行归一化。单应性是一个3x3矩阵,它通常除以(3,3)处的元素进行归一化。当该值非常小(例如0.0000008)并除以一个应该为零的值(0.0000007)时,就会出现问题。结果值几乎是0.875,当它被假设为零并且结果投影没有意义时。我想知道解决这个问题的常用方法是什么。我使用C++和浮点运算。 最佳答案 所以,如果我理解这个问题:0/0.000000001=0=CORRECT和:0.000000001/0.000000001~1INCORRECT我将定义一个函数

c++ - 如何在 C++ 中避免 "template template template"模板

我已经尝试实现一个“模板模板模板”——模板类来满足我的需求(我对使用模板元编程很陌生)。不幸的是,我发现以下主题为时已晚:TemplateTemplateParameters不过,我需要实现如下所列的内容。根据编译器,最后一个typedef不工作。我不确定,但我认为这是由于3x模板限制的限制。在这个简单的示例中是否有可能绕过3xtemplate定义?templateclassITTranslator{public:ITTranslator()=0;virtual~ITTranslator()=0;virtualvoiddoSomething()=0;}templateclassTCon

c++ - 是否有任何理由避免使用 tmpnam() 来获取临时文件的名称?

我打算使用tmpnam()命名一个临时文件,稍后将重命名,而不是删除。但是我找到了以下文档,现在我对上面写的部分很感兴趣“...天真的程序员可能认为它是临时文件的合适名称。”来自http://man7.org/linux/man-pages/man3/tmpnam.3.htmlThetmpnam()functionreturnsapointertoastringthatisavalidfilename,andsuchthatafilewiththisnamedidnotexistatsomepointintime,sothatnaiveprogrammersmaythinkitasui

c++ - FlatBuffers 是否以某种方式避免了严格的别名?

我最近一直在研究FlatBuffers库。我正在寻找评估它以用于我的项目。看着flatbuffers.h,我想知道是否违反了strict-aliasingrule如果它确实考虑了严格的别名,有人可以解释它是如何做到的吗?在以前的项目中,我很难学到这个规则,优化会产生难以发现的细微错误。我一直在使用placementnewoperator避免使用编译器标志来解决这个问题。链接:flatbuffers.hstrict-aliasingruleplacementnewoperator 最佳答案 目前,读取FlatBuffer完全是只读的事