草庐IT

惯用语

全部标签

c++ - 是否有任何惯用的显式使用 mutex::lock() 或 unlock()?

推荐的使用方式mutex用于锁定代码的关键区域是通过RAII,即mutex_typemutex;{//startofcriticalregionstd::lock_guardlock(mutex);//firststatementincriticalregion//...docriticalstuff,maythrowanexception}//endofcriticalregion这样当在临界区内抛出异常时,互斥量仍将被解锁(由std::lock_guard的析构函数)。然而,这样的成员mutex::lock()和mutex::unlock()永远不会被用户代码显式调用。Qmutex

c++ - 根据其他参数计算模板参数的惯用方法

我正在寻找一种惯用的方法来优化我编写的这个模板。我主要关心的是如何正确定义模板参数n并将其用作返回参数,同时用户不得覆盖它。我也愿意听取有关如何以惯用的C++14方式编写此模板的其他建议。templatestd::arrayhash_to_color(InTypein)noexcept{InTypemask=~0;mask=maskout;autoout_max=static_cast((1>(i*bits))&mask;out[i]=static_cast(selected)/out_max;}returnout;} 最佳答案 关

c++ - 给定字符串 vector (按长度排序),用于查找等长字符串范围的惯用 C++

给定一个std::vector,vector按字符串长度排序,如何找到等长强度的范围?我期待C++中的惯用解决方案。我找到了这个解决方案://anyideaforabettername?(Englishisnotmymothertongue)boolless_length(conststd::string&lhs,conststd::string&rhs){returnlhs.length()words;words.push_back("ape");words.push_back("cat");words.push_back("dog");words.push_back("camel"

c++ - 用于从 std::map 的最后 n 个元素创建 std::vector 的惯用 C++

从std::map的最后n个元素创建std::vector的C++惯用方法是什么?我对保留vector中的顺序不感兴趣。我可以像这样复制元素:std::mapm;size_tn=3;std::vectorv;std::map::iteratorit=m.end();while(n--){//assumingm.size()>=nit--;v.push_back(it->second);}但是,有没有其他更惯用的方法来做到这一点? 最佳答案 std::copy如果您想复制类型不变,那将是合适的。然而,std::map::iterato

C++ header 保护对象和用法?

我习惯于在我的元素周围放置护栏,例如:#ifndefSOMETHING_H#defineSOMETHING_HclassSomething{...}#endif但我得到了代码,他们也这样做了:#ifndefSOMETHING_H#include"something.h"#endif对于每一个包含。据说,这样更好。为什么?物体周围有守卫,这是否多余? 最佳答案 此处对此进行了非常详细的讨论:http://c2.com/cgi/wiki?RedundantIncludeGuards以下是亮点:是的,这是多余的,但对于某些编译器来说,它可

c++ - 从 std::array 等获取 size_type 的惯用方法

由thisquestion触发,我想出了以下代码(在我的回答中是boost::array,但同样适用于std::array):template::size_typesize>voidDataTransform(std::arraydata){}我对::size_type一点都不满意.我必须以一定的大小进行实例化,才能知道size_type.对于std::array我本可以使用size_t,那么一般情况呢?如果size_type怎么办不是size_t?或者更一般的(即不适用于std::array)如果size_type怎么办?不同的尺寸是不同的(愚蠢但可能)?我知道这个问题相当学术,有很

c++ - 在 NVI 惯用语下,为什么虚函数不能公开?

C++privateandprotectedvirtualmethod和Isthereanyvalidreasonfornotusingpublicvirtualmethods?正在谈论非虚拟接口(interface)(NVI)和非公共(public)虚拟功能及其共生。ScottMeyers在EffectiveC++中也说Sometimesavirtualfunctionevenhastobepublic,butthentheNVIidiomcan'treallybeapplied.我没看到的是为什么NVI要求实现特定的虚函数是非公开的?来自HerbSutter的文章Virtualit

c++ - 强制执行 constexpr 函数的 constexpr-ness 的惯用方式

考虑以下示例代码:#includevoidblah();intbuh;constexprautoget(){returnstd::get(std::make_tuple(&blah,&buh));}intmain(){get();}人们会期望因为函数get()是一个常量表达式,所以它会返回一个常量。事实并非如此:std::make_tuple、std::get被实例化并调用:https://godbolt.org/g/PkHrTp现在,如果我们将get()的实现替换为constexprautoget(){constexprautox=std::get(std::make_tuple(&

C++ 惯用法之 Policy-based design

一、背景Policy-based是C++的一种基于模板和继承的设计方法。通过模板方式可以实现在编译期给指定的类配置方法,而传统的策略模式则是在运行期对类的方法进行动态配置。所谓设计模式没有一定不变的使用准则,同一个问题可以有多种模式来解决,采用有效的设计模式可以减少重复性代码以及用最小的改动来应对变化。多了解一种模式,可以增加一种解决问题的思路。二、Policy-baseddesign1.概述该模式中的继承是implement-by的关系,而非Is-A的关系,其重点是模板而非继承。2.问题描述假设一个类提供一个对外的接口,但在不同的场景中有不同的实现方式,以下是一种常见的实现代码:classd

c++ - 在 C++ 中跨文件行并行化函数的惯用方法

我发现自己经常编写以下形式的C++代码:while(getline(strm,line)){cout我想并行化这段代码。到目前为止,我提出的最佳解决方案是构建字符串vector以容纳大量(10000-100000)行,然后使用在该vector上并行化#pragmaompparallelfor然后清空vector并在保留行的同时重复。但是,这种方法需要大量内存,并且在主进程缓冲字符串时其他内核处于空闲状态。有没有更好的办法?类似于Python的multiprocessing.Pool.map或Hadoop?(不过,我想避免使用Hadoop的C++API,因为Hadoop相当重量级,可能不