草庐IT

c++ - 使用 Uncrustify 完全拆分长函数定义,不仅在逗号处

我正在使用Uncrustifyv0.60来格式化我的C++源代码。为了配置Uncrustify,我使用了UniversalIndentGUIv1.2.0rev.1070。在UniversalIndentGUI的LineSplittingoptions部分,我将CodeWidth设置为120。假设我有以下示例代码:namespaceMyNameSpace{classMyClass{public:std::map*ConstructMyOtherClassMap(std::vector*allNames,intarg0,doublearg1,chararg2);}}该方法声明以大于120的

c++ - C++ 中函数类型的模板参数

在这里,Wrapper::set应该能够采用与int(int)匹配的任何函数或函数对象签名,并将其存储到std::function中.它应该与函数指针、lambdas、带有operator()的对象一起使用,std::bind表达式等#includestructWrapper{usingfunction_type=int(int);std::functionfunc_;templatevoidset(Funcfunc){func_=func;}};set的最佳形式是什么?以便它适用于所有情况?IE。其中之一set(Funcfunc){func_=func;}set(Func&&func

C++11:函数模板:通过引用传递参数

有一种模板函数通过引用传递参数+回调函数,但是如果参数通过引用传递给回调函数则编译器会抛出错误:nomatchingfunctionforcalltofunc(int&,void(&)(int&)).怎么了?templateusingfunc_t=void(T);templatevoidfunc(T&arg,func_tcallback){callback(arg);}voidfunc1(intarg){}voidfunc2(int&arg){}// 最佳答案 扣除T在第二次调用中失败,因为T出现在两个推断的上下文中,这两个上下文推

c++ - 为什么我不能推断静态成员函数是否存在

我有以下代码:#includetemplatestructfunc_impl;templateconstexprinlineboolhas_func=false;templateconstexprinlineboolhas_func::apply(std::declval()))>=true;templatestructfunc_impl{staticintapply(inti);};static_assert(has_func);static_assert失败了,而我预计它会成功。我做错了什么? 最佳答案 问题是第二个模板参数的默

c++ - 强制派生类覆盖至少一个虚函数

想象一下这个简单的基类:structsimple_http_service{virtualreplyhttp_get(…);virtualreplyhttp_post(…);virtualreplyhttp_delete(…);//etc.};我想阻止用户从此类派生而不覆盖至少其中一个,并阻止他们实例化simple_http_service有什么好的方法可以做到这一点吗? 最佳答案 这听起来像是一个非常奇怪的约束。一定要保护用户免受不正确的使用,但不要试图禁止您只是“看不到重点”的事情。如果在不覆盖这三个函数中的任何一个的情况下从你

C++ 模板特化 - 避免重新定义

我想要一个接受不同类型参数的通用函数(或方法)。如果提供的类型有“一个”方法,函数应该使用它。如果它有“两个”方法,则该函数应该使用它。这是无效代码:#includetemplatevoidfunc(Typet){t.one();}templatevoidfunc(Typet)//redefinition!{t.two();}classOne{voidone(void)const{std::cout是否可以使用SFINAE来实现?是否可以使用type_traits来实现?澄清:如果使用SFINAE可以做到这一点,我会更高兴。最好的情况是:使用第一个模板,如果失败则使用第二个。检查方法是

c++ - 具有函数默认值的参数分配

我有线程生成函数,它接受许多在声明中具有默认值的参数。intspawn(funcptrfunc,voidarg=0,intgrp_id=1,constchar线程名);我想初始化第一个参数func和最后一个参数threadname,其余变量赋默认值。spawn(myfunc,"我的线程");我该怎么做。 最佳答案 你不能。其他语言支持spawn(myfunc,,,"MyThread"),但不支持C++。相反,只需根据自己的喜好重载即可:inlineintspawn(funcptrfunc,constchar*threadname){

c++ - 在容器中存储 boost::function 对象

我有一个KeyCallbackvector:typedefboost::functionKeyCallback我用它来存储按下键盘按钮时的所有监听器。我可以使用for_each添加它们并将事件分派(dispatch)给所有回调,但我不知道如何从我的vector中实际删除特定的KeyCallback签名。例如我想要这样的东西:voidInputManager::UnregisterCallback(KeyCallbackcallback){mKeyCallbacks.erase(std::find(mKeyCallbacks.begin(),mKeyCallbacks.end(),cal

c++ - 从自身内部替换 std::function(通过 move 赋值到 *this?)

是否可以用另一个std::function替换一个std::function?以下代码无法编译:#include#includeintmain(){std::functionfunc=[](){std::cout可以修改编译吗?现在的错误消息是:'this'wasnotcapturedforthislambdafunction-我完全理解。但是,我不知道如何捕获func的this指针。我想,它甚至不是lambda中的std::function吧?!如何做到这一点?背景:我想要实现的是:在给定std::function的第一次调用中,我想做一些初始化工作然后替换具有优化功能的原始功能。我

c++ - __cdecl 导致比 __stdcall 更大的可执行文件?

我发现了这个:Becausethestackiscleanedbythecalledfunction,the__stdcallcallingconventioncreatessmallerexecutablesthan__cdecl,inwhichthecodeforstackcleanupmustbegeneratedforeachfunctioncall.假设我有两个函数:void__cdeclfunc1(intx){//dosomestuffusingx}void__stdcallfunc2(intx,inty){//dosomestuffusingx,y}在main()中:in