草庐IT

c++ - 使用 CRTP 时如何获取模板参数的大小?

在VC++10中,以下示例失败并出现错误C2027:“使用未定义的类型‘X’”。然而g++4.6编译它就好了。templateclassC{staticconstsize_tsize=sizeof(T);};classX:publicC{};那么哪个是对的呢?我该怎么做才能让它在主流编译器上运行?不过这没什么大不了的,因为VC++仍然允许在C的成员函数中使用sizeof(T)。我只需要重复一些很烦人的长类型定义。编辑:我意识到我的示例很糟糕,因为我真正想做的是使用大小作为编译时间常量,以这种方式:templateclassC2{};templateclassC{typedefC2A;}

dictionary changed size during iteration 报错

dictionarychangedsizeduringiteration报错当使用for循环遍历一个字典(dict)时,如果在循环过程中对字典进行了修改,就会出现dictionarychangedsizeduringiteration错误。这是因为在Python中,字典的遍历是通过迭代器实现的,而在迭代过程中不能修改字典的大小。例如,以下示例代码会引发该错误:my_dict={'a':1,'b':2,'c':3}forkeyinmy_dict:ifkey=='b':delmy_dict[key]上述示例代码中,使用for循环遍历my_dict字典,当字典中的键为‘b’时,删除该键。但是,由于删

C++ 模板参数推断

作为练习,我尝试使用模板编写数组实现,但使用函数指针作为模板参数。每次数组被索引时都会调用此函数。templateusingArray_fnIndex=void(*)(intindex);templatefnIndex>structArray{Tdata[size];T&operator[](intindex){fnIndex(index);returndata[index];}};//exampleindexfunctiontemplatevoidcheckIndex(intindex){assert(index>a;//thisworksArray>b;//thisalsowork

c++ - 就 c++ 接口(interface)而言,什么是(简单理解)窄契约(Contract)和宽契约(Contract)?

在浏览一些c++11概念时,我遇到了术语narrowcontract和widecontract。但我没能找出为这些合约编写的简单函数示例。我可以看一个简单的函数示例来区分这两个合约吗? 最佳答案 宽合约函数对所有可能的输入都有明确定义的行为,而窄合约意味着函数只能在满足特定先决条件时调用。“输入”还可能包括全局状态或为其调用成员函数的对象。明确定义的行为可能意味着抛出异常。例如,std::vector-s.size()成员函数具有广泛的契约,因为它可以在vector的任何实例上调用(如std::vectorv;/*anythingc

c++ - 首选包含 std::size_t 的 header

std::size_t在以下任何一个中定义:因为只得到std::size_t而被认为是“犹太洁食”? 最佳答案 因为这是C库的一部分,我认为C标准指定的header是正确的:stddef.h,即cstddef.来自C11:7.19CommondefinitionsTheheaderdefinesthefollowingmacrosanddeclaresthefollowingtypes.Somearealsodefinedinotherheaders,asnotedintheirrespectivesubclauses.[...]s

c++ - STL 列表性能很差

假定STL列表(作为双链表实现)的“push_back”和“pop_front”方法应该是常量O(1)。然而,我们在linux上运行的应用程序中遇到了cpu问题,我们发现“pop_front”方法在使用列表时效率极低。这是列表实现问题还是预期行为?这是示例代码:classA{public:A(){mA=rand();mB=rand();mC=rand();mD=rand();}u32mA;u32mB;u32mC;u32mD;};#defineDELTA(t1,t0)((t1.tv_sec-t0.tv_sec)*1000+((t1.tv_usec-t0.tv_usec)/1000))in

c++ - 为什么 std::size_t 在 32 位系统上是 4 个字节,而 unsigned long long 在 32 位和 64 位系统上都是 8 个字节?

问题很简单。在32位系统上:std::cout在64位系统上:std::cout我只检查了MSVC的实现,它看起来像这样:#ifdef_WIN64typedefunsigned__int64size_t;#elsetypedefunsignedintsize_t;#endif那么为什么不在32位和64位系统上制作std::size_tunsignedlonglong(std::uintmax_t)支持吗?还是我错了? 最佳答案 size_t的要点是能够容纳最大可能对象的大小。在32位系统上,任何对象都不能占用超过2**32字节,因此

c++ - std::hash 值在 char* 值上而不是在内存地址上?

如本link所述:ThereisnospecializationforCstrings.std::hashproducesahashofthevalueofthepointer(thememoryaddress),itdoesnotexaminethecontentsofanycharacterarray.这意味着使用相同的char*值,可以产生不同的哈希码。例如,有这样的代码://MOKandMOVaretemplateargumentsvoidemit(MOKkey,MOVvalue){autoh=hash()(key);cout这是通过调用4次emit()对相同的key(使用MO

c++ - 什么时候需要在 C++ 中使用 decltype

我正在学习C++,并且在C++primer中找到了以下代码:intmain(){strings("somestring");for(decltype(s.size())index=0;index!=s.size()&&!isspace(s[index]);++index)s[index]=toupper(s[index]);cout我理解代码将字符串中的第一个单词大写,输出是SOMEstring我很好奇的是为什么你需要使用decltype(s.size())来声明索引的类型。如果我将其更改为intindex=0,代码仍然可以正常编译和运行。对我来说使用int似乎更容易。我想我在这里遗漏

c++ - 用 unsigned long 替换 size_t 的缺点是什么

我正在开发的库需要在32位和64位机器上使用;我有很多编译器警告,因为在64位机器上unsignedint!=size_t。将所有unsignedint和size_t替换为“unsignedlong”有什么缺点吗?我很欣赏它看起来不是很优雅,但是,在这种情况下,内存不是太大的问题......我想知道是否有可能由这样的替换产生任何错误/不需要的行为等all操作(你能举个例子吗)?谢谢。 最佳答案 什么警告?我能想到的最明显的一个是“缩小转换”,也就是说你正在将size_t分配给unsignedint,并收到一条警告信息可能迷路了。用u