草庐IT

int_void

全部标签

C++ API 设计 : is using void* a bad idea?

我正在开发一个我希望在调用方尽可能通用的API。主要设计思想是提供一种信号/插槽类型的实现,允许API的用户订阅一组给定的事件,并将用户定义的回调附加到它们。公共(public)界面看起来像这样:RetCallbacksubscribe(EventEnum&ev,std::functionfn)const;:注意void(void*)在这里签名。EventEnum在公共(public)头文件中给出,以及类型定义。然后,API的内部工作将通过通知方法将事件通知其订阅的观察者,并提供要转发给客户端的数据:voiddummyHeavyOperation()const{std::this_th

c++ - 我应该使用什么而不是 void 作为变体中的替代类型之一?

我想要一个变体,它可能包含Foo类型、(不相交的)Bar类型,或者什么都不包含。好吧,自然地,我在考虑使用std::variant-但这似乎不起作用。也就是说,您可以定义此类型,但如果您尝试实例化此类型,您将失败(GCC8.2)。那我该用什么呢?某种空结构? 最佳答案 您真正想要的是备选方案中的一种类型,它具有单个可能值-而不是void,它没有可能的值(并且在其他方​​面存在问题)。换句话说:Aunittype而不是bottomtype.标准库已定义为的一部分,此用例的“单元类型”:std::monostate(是的,它本质上是一个

c++ - 在 C/C++ 中从 int 获取单个数字以进行基数排序的最佳方法

从具有n个数字的int中获取单个数字以用于基数排序算法的最佳方法是什么?我想知道在C/C++中是否有特别好的方法,如果没有,一般的最佳解决方案是什么?编辑:澄清一下,我正在寻找一种解决方案,而不是将其转换为字符串并将其视为数字数组。 最佳答案 使用大小为2^k的数字。要提取第n个数字:#defineBASE(2>(n*k))&MASK;}使用移位和掩码(由基数为2的幂启用)避免昂贵的整数除法指令。之后,选择最佳基础是一个实验性问题(针对您的特定硬件进行时间/空间权衡)。可能k==3(base8)效果很好并且限制了buckets的数量

c++ - 如何将 QMap<QString, QMap<QString, int>> 转换为 QVariant?

QVariant(需要QSettings类)支持从QMap创建但是尝试初始化这样的东西:QMap)>i;给出错误:functionreturningafunction.然后我尝试了QMapQVariant()过载得到了error:nomatchingfunctionforcalltoQVariant::QVariant(QMap>&)现在我尝试了一个类型转换:QMap>i;得到了templateargument2isinvalidinvalidtypeindeclarationbefore';'token那么转换嵌套QMap所需的巫术是什么?到QVariant对象?

c++ - 参数类型 void*& 是什么意思,有什么用?

我正在查看一个用C++编写的API,我对以下参数类型的含义感到困惑:无效*&数据这是否意味着用户将传递对空指针的引用?如果那是真的,那有什么意义呢?我的意思是void*已经是间接的,那么你为什么还要再次重定向它呢? 最佳答案 void*在C++中是pass-by-pointer的意思,意思是你传入一个指针,但实际上是指针的一个拷贝。如果你在你的函数中修改了这个指针,比如改变它的地址,它不会反射(reflect)在你传入的指针中。结合引用传递,void*&意味着您将原始指针的别名传递给此函数。如果你修改它,比如改变它的地址,它会反射(

c++ - 无法将 INT_MIN 的值分配给 long long

signedlonglongvalue=-2147483648;cout输出2147483648(没有减号),为什么? 最佳答案 signedlonglongvalue=-2147483648;2147483648无法用32位有符号整数表示,因此将其转换为无符号整数,然后应用一元减号(不会更改任何内容),然后将其分配给签名长长。使用-2147483648LL 关于c++-无法将INT_MIN的值分配给longlong,我们在StackOverflow上找到一个类似的问题:

c++ - 为什么 void 在 C++ 中不采用 void 值?

我很好奇为什么C++不通过:定义voidtypedefstruct{}void;即无法实例化的类型的值是什么,即使该安装必须不产生代码?如果我们使用gcc-O3-S,那么以下两个都会产生相同的汇编程序:intmain(){return0;}和templateTf(Ta){}typedefstruct{}moo;intmain(){mooa;f(a);return0;}这很有道理。struct{}只需要一个空值,很容易优化掉。事实上,奇怪的是它们在没有-O3的情况下生成不同的代码。但是,您不能简单地使用typedefvoidmoo来实现同样的技巧,因为void不能假定任何值,甚至不能是空

c++ - 旧版本的 C++ 在评估 `int` 语句中的条件时是否使用了类的 `if()` 运算符?

现代版本的C++在评估if()语句中的条件时尝试使用类的bool运算符。其他转换运算符,例如int在不存在bool运算符时使用。如下所示。#includeusingnamespacestd;classTwoInts{public:inta,b;operatorbool(){cout运行这段代码不会产生任何意外:TwoIntstoboolSixIntstoint查看一些旧的C++代码,似乎有一个更改需要验证。旧版本的C++在评估if()语句中的条件时是否使用了类的int运算符?什么版本(如果有)做过某事?那么建议的输出应该是TwoIntstointSixIntstoint关于问题原因的一

C++从istream读取int,检测溢出

如果我使用>>运算符从istream中读取一个整数,并且表示的整数大于INT_MAX,则该操作只返回INT_MAX。我目前正在与INT_MAX进行比较以检测溢出,但如果输入操作“2147483647”,那么它会返回一个错误,而实际上没有错误,结果是有效的。例子:http://ideone.com/4bXyGd#include#include#includeintmain(){std::istringstreamst("1234567890123");//Trywith2147483647intresult;st>>result;if(result==INT_MAX)std::cout在

c++ - 为什么 implicit == on map<<int,MyClass> 不编译?

我在为我的一个类(class)定义==时遇到了一个奇怪的问题。我将此处的代码简化为我在visual2013上测试过的示例;MyClass在命名空间N中定义这确实编译:N::MyClassa,b;booltest=a==b;这也是:constN::MyClassa,b;booltest=a==b;这不编译std::mapa,b;booltest=a==b;供您引用,=​​=运算符声明如下:booloperator==(constN::MyClass&a,constN::MyClass&b);这是我得到的错误:errorC2678:binary'==':nooperatorfoundwhi