草庐IT

binary-arithmetic-operations

全部标签

c++ - 为什么存储在 STL 容器中的类禁止重载 operator&()?

突然在thisarticle("problem2")我看到一条声明,如果该类具有重载的operator&(),则C++标准禁止使用STL容器来存储该类的元素。重载operator&()canindeedbeproblematic,但看起来可以通过asetofdirty-lookingcaststhatareusedinboost::addressof()轻松使用默认的“寻址”运算符并且被认为是便携的和符合标准的。为什么存在boost::addressof()解决方法时,禁止对存储在STL容器中的类重载operator&()? 最佳答案

c++ - msgpack C++ 实现 : How to pack binary data?

我正在使用C++msgpack实现。关于如何打包二进制数据,我遇到了障碍。就二进制数据而言,我有以下类型的缓冲区:unsignedchar*data;data变量指向一个实际上是图像的数组。我想要做的是使用msgpack打包它。似乎没有关于如何实际打包二进制数据的示例。来自formatspecification支持原始字节,但我不确定如何使用该功能。我尝试使用如下字符指针vector:msgpack::sbuffertemp_sbuffer;std::vectorvec;msgpack::pack(temp_sbuffer,vec);但这会导致编译器错误,因为没有用于T=std::ve

c++ - 为什么 std::sort 不使用我的 operator< 实现

为什么std::sort不使用我的operator在thiscode中实现#include#include#include#includeusingnamespacestd;booloperator&t1,consttuple&t2){returnget(t1)>get(t2);//`>`sothatitgetssortedinreverse}intmain(){vector>v;for(inti=0;i(x)(x)(t1)>get(t2);//`>`sothatitgetssortedinreverse});cout(x)输出是:beforesort:0,1,2,3,4,5,6,7,

c++ - 如何为 std::variant 编写 operator<<?

我想写operator对于std::variant.假设是operator对于特定变体,只有在operator时才有效对变体可以包含的所有类型都有效。 最佳答案 //g++(GCC)7.2.0//g++-std=c++1z-O2-Wall-pedantic-pthreadmain.cpp#include#include#include#includetemplatestd::ostream&operator&v){std::visit([&os](auto&&arg){os>v=4;std::coutDemo这依赖于将通用lambd

c++ - std::map operator[] 中的违规读取位置

我在运行一些传给我的旧代码时遇到了问题。它在99%的时间都有效,但偶尔,我注意到它会抛出“违反读取位置”异常。我有可变数量的线程可能在整个进程的生命周期内执行此代码。低出现频率可能表明存在竞争条件,但我不知道为什么在这种情况下会导致异常。这是有问题的代码:MyClass::Dostuff(){staticmapmappedChars;if(mappedChars.empty()){for(charc='0';c在map的operator[]实现中抛出异常,在第一次调用operator[]时(使用STL的VS2005实现。)mapped_type&operator[](constkey_

c++ - 在 C++ 中重载比较运算符导致 "invalid operator<"

目前正在尝试在C++中对对象vector进行排序,每个对象包含一个字符串字符串可以包含字母或数字(由于设计限制,这是必要的,因为比较器可以更改)。此时重载对象的类,这样当比较两个对象时,比较的是它们包含的字符串。这在一定程度上起作用——但是,当我使用排序操作(例如STL排序)对对象进行排序时,它将按顺序对三个字符串(例如“1”、“4”、“12”)进行排序“1”、“12”、“4”。4大于12,但因为它从最左边的数字开始比较,所以会出现这种“不正确”的排序。我最初的react是改变我重载比较操作的方式。我会首先检查我正在比较的字符串的长度——如果字符串的内容更大或更小,这将是一个明显的迹象

c++ - 如何知道链自定义operator<<调用的次数?

我有自己的类,我可以像这样定义和使用vw&vw::operator链除了向每个链添加一个特殊的终止值(如下所示)之外,我是否还有其他选择可以知道它何时完成?instEDIT2:LogicStuff答案之后的当前解决方案:---chain.h---#pragmaonce#includeclasschain{public:chain();~chain();};---chain_cutter.h---#pragmaonce#include"chain.h"classchain_cutter{chain&inst;public:explicitchain_cutter(chain&inst):

c++ - 调用 operator() 时是否可以提供模板参数?

我想使用模板operator()但不确定是否可行。这是一个无法编译的简单测试用例。我的语法有问题吗,还是这根本不可能?structA{templatevoidf(){}templatevoidoperator()(){}};intmain(){Aa;a.f();//Thiscompiles.a.operator()();//Thiscompiles.a();//Thiswon'tcompile.return0;} 最佳答案 就像评论中提到的克里斯一样,不,不使用速记语法。您必须使用完整的.operator()()句法;

c++ - 填充 std::map 时为 "C2593: operator = is ambiguous"

我有一个std::map我正在尝试使用初始化列表进行初始化。我在两个地方以两种不同的方式这样做。第一个有效,而另一个导致标题中提到的错误。这是有效的:voidfoo(){staticstd::mapfooMap={{"First","ABC"},{"Second","DEF"}};}虽然这个没有:classBar{public:Bar();private:std::mapbarMap;};Bar::Bar(){barMap={//为什么在尝试初始化类成员时出现错误,而静态映射有效?目前,我可以通过首先创建一个局部变量然后将其与成员交换来填充成员,如下所示:Bar::Bar(){std:

C++ - 重载 operator new 并提供额外的参数

我知道您可以重载运算符new。当您这样做时,默认情况下您的方法会收到一个size_t参数。但是,是否可以将size_t参数以及用户提供的其他参数发送到重载的new运算符方法?例如inta=5;Monkey*monk=newMonkey(a);因为我想像这样覆盖新的操作符void*Monkey::operatornew(size_tsize,inta){...}谢谢编辑:这是我想要完成的:我在应用程序开始时分配了一大块虚拟内存(内存池)。继承我的基类的所有对象都将继承其重载的new运算符。我有时想在重载的new中传递一个参数的原因是告诉我的内存管理器我是否想使用内存池,或者我是否想用ma