草庐IT

C++ 最佳实践 - 函数类型别名 std::function<T> 或 T

在C++中为函数类型声明类型别名时,什么被认为是最佳或良好实践(我知道这部分问题可能是主观的)?要么usingFuncType=void(int,int);或usingFuncType=std::function;两者之间有什么好处吗?例如,我应该如何将这些类型用作函数参数(当作为仿函数、lambda、成员或全局函数传递时)voidfoo(FuncType&&func){...}voidfoo(FuncTypefunc){...}voidfoo(std::functionfunc){...}编辑我知道并非我上面的所有示例都适用于#1和#2,但这不是重点。我想知道哪个(以及为什么)选项更

c++ - 这段代码违反了严格的别名规则?

我读了https://www.qt.io/blog/2011/06/10/type-punning-and-strict-aliasing,并找到了这段代码。QDataStream&QDataStream::operator>>(qint16&i){...registeruchar*p=(uchar*)(&i);charb[2];if(dev->read(b,2)==2){*p++=b[1];*p=b[0];...作者声称MSVC优化了我觉得很奇怪的赋值。MSVC真的利用了严格的别名规则吗?uchar*不是特别允许用来做类型双关吗? 最佳答案

c++ - 更高类型的别名模板

让我们调用一个看起来像T的类型一种更高等的类型。对于某种高级类型SomeType(假设它是std::vector),我想使用类型特征来提取T它的一部分(std::vector)。我可以做类似的事情:templatestructHKT;templateclassT,typename...Us>structHKT>{templateusingtype=T;};所以现在我可以做HKT::type定义一个std::vector.但我正试图摆脱::type部分,就像typenamestd::enable_if::type可以简写为std::enable_if_t.不确定是否可行,因为在我的例子中

c++ - 签名/未签名别名规则是否按预期工作?

这是C++17形式的规则([basic.lval]/8),但它在其他标准中看起来很相似(在C++98中是“lvalue”而不是“glvalue”):8Ifaprogramattemptstoaccessthestoredvalueofanobjectthroughaglvalueofotherthanoneofthefollowingtypesthebehaviorisundefined:(8.4)—atypethatisthesignedorunsignedtypecorrespondingtothedynamictypeoftheobject这条规则听起来像是“除非你做了X,否则你

c++ - 创建 `std::forward` 别名 - 意外结果

我创建了一个std::forward别名应与std::forward完全相同.templateconstexprdecltype(auto)fwd(TmValue)noexcept{returnstd::forward(mValue);}然后我替换了所有出现的std::forward与fwd在我的代码库中。用g++4.9编译了所有项目-所有测试均通过,一切正常。然后我尝试用clang++3.5编译.一些测试似乎随机失败,原因是fwd.将其替换为std::forward再次修复失败的测试。我试着写fwd正如我所想的那样,使用尾随返回类型语法decltype(auto)不工作:templa

c++ - is_same_template 在模板别名上的奇怪行为

下面的程序...#include#includetemplatestructTemplate{};templateusingAlias=Template;templateclassT1,templateclassT2>structis_same_template:std::false_type{};templateclassT>structis_same_template:std::true_type{};intmain(){std::cout::value::value::value...输出...Template==Template:trueTemplate==Alias:fals

c++ - 通用类型别名,它们彼此不兼容

我正在尝试构建某种“通用类型别名”,这意味着我想将类型定义为int,但带有通用类型参数,这使得它与实例不兼容其他类型。我试着用别名模板来做这个:templateusingNumberWithSemantics=int;但这样做的问题是所有的实例化,无论类型T,都被认为是相等的,例如:structA{};structB{};NumberWithSemanticsgetThing(){return14;}intprocessDifferentThing(NumberWithSemanticsb){returnb*3;}intmain(){autoa=getThing();returnpro

c++ - 类型别名允许分配任意指针,尽管 int* 是预期的

我今天遇到一个有趣的问题,涉及从非匹配类型的函数指针赋值给指针。编辑:受@Frank启发的较短示例:voidprintSquare(intx){printf("%d\n",x*x);}int*foo(){usingres_t=int*;returnres_t(printSquare);}我希望代码不会编译,因为函数的返回类型应该是int*,它决不能从函数引用或类型系统的边界(据我所知)。当直接返回或用int*替换res_t时,编译器拒绝该程序,但在其间使用using声明,它编译并运行(尽管指向的位置当然不包含一个int,而是一个函数)。原始代码和问题保存在下面单独的答案中。

c++ - 严格的别名似乎不一致

有几个来自严格别名的错误,所以我想我会尝试修复所有这些错误。仔细研究了它是什么,有时GCC似乎没有发出警告,而且有些事情是不可能实现的。至少根据我的理解,下面的每一个都被打破了。那么我的理解是错误的,是否有正确的方法来做所有这些事情,或者某些代码是否只需要在技术上打破规则并被系统测试很好地覆盖?这些错误来自一些混合了char和unsignedchar缓冲区的代码,例如如下所示:size_tProcess(char*buf,char*end){char*p=buf;ProcessSome((unsignedchar**)&p,(unsignedchar*)end);//GCCdecide

c++ - 类型到值元函数可以用作 C++14 中的变量别名吗?

在查看C++14元函数别名提案(TransformationTraitsRedux,v2,N3655)时,我注意到,不仅类型到类型转换(例如add_const),类型到值元函数(例如is_void)也是类型别名。(在N3797中不存在)。使用别名类型来赋值元函数有什么好处吗?我认为,可以在没有这些别名的情况下使用它们,例如存在转换操作时的enable_if_t::value,T>或enable_if_t{}(),T>。(我猜is_void::type::value和is_void::value一样)如果值元函数的类型需要别名,将它们别名为变量模板不是更好吗(我没有C++14编译器,也从