jjzjj

c++ - 修改后的 std::invoke/std::apply,将可调用对象作为 void* - 可能吗?

在C++17中我们有std::invoke:templatestd::result_of_tinvoke(F&&f,ArgTypes&&...args);(并且在C++11中已经有std::experimental::apply,它是相似的,但有一个元组)。现在,我要实现:templateTinvoke(void*f,ArgTypes&&...args);与std::invoke的不同之处在于f是通过void指针传递的,并且其类型没有模板参数。然而,类型可以被人类读者推断出来,前提是f是一个指向普通独立函数的指针,我可以这样做:templateTmy_invoke(void*f,Arg

c++ - 这是 MSVC 中依赖名称解析的错误吗?

关于cppreference.com,以下代码作为解释相关名称解析的示例提供:#includevoidg(double){std::coutstructS{voidf()const{g(1);//"g"isanon-dependentname,boundnow}};voidg(int){std::couts;s.f();//callsg(double)}当前版本的VisualC++(19.0.23918.0)产生以下输出:g(int)g(int)这是标准允许的,还是MSVC中的错误? 最佳答案 “从属名称解析”在这里具有误导性。g是

c++ - 为什么将 void 与函数一起使用?

我知道void不返回任何值。那么它是如何结合函数起作用的呢?我的理解是,函数的目的是在对它执行某些操作后返回一条信息。那么为什么我不想返回任何值,这将如何受益? 最佳答案 Myunderstandingisthatthepurposeofafunctionistoreturnapieceofinformationafterdoingsomethingwithit.在某些(大多数)编程语言中,函数也有副作用。一些函数的目的仅限于副作用,不需要返回值。此类函数具有void返回类型。一些副作用的例子可能是:更新全局用户不想知道操作状态的文

c++ - 函数指针引用参数转换为const

示例代码:classFoo;typedefvoid(*fnptr)(Foo&foo);fnptrgFn;voidmyfoo(constFoo&foo){}intmain(){gFn=&myfoo;}使用clang失败并出现以下错误:main.cpp:9:9:error:assigningto'fnptr'(aka'void(*)(Foo&)')fromincompatibletype'void(*)(constFoo&)':typemismatchat1stparameter('Foo&'vs'constFoo&')gFn=&myfoo;^~~~~~~1errorgenerated.G

c++ - 将实现注入(inject)到单个多功能接口(interface)类 - 许多 CRTP 类?

如何创建许多类来充当接口(interface)类的实现者,同时尽可能避免v-table成本,并仍然启用对接口(interface)的静态转换?对于简单的情况,可以像下面的例子那样实现。例子图书馆代码:-classI{//interfacepublic:virtualvoidi1()=0;};templateclassRouter:publicI{public:virtualvoidi1()final{//inrealcaseitisverycomplex,butinthecoreiscalling:-static_cast(this)->u1();}};用户代码:-classUser:

c++ - clang-4.0 初始化全局变量时产生冗余方法

我最近通过观察clang如何处理复杂情况来学习LLVM。我写了(顶层,不在函数中):intqaq=666;inttat=233;autohh=qaq+tat;然后我使用命令:clang-4.0003.cpp-emit-llvm-S-std=c++11clang生成如下代码:@qaq=globali32666,align4@tat=globali32233,align4@hh=globali320,align4@llvm.global_ctors=appendingglobal[1x{i32,void()*,i8*}][{i32,void()*,i8*}{i3265535,void()*

c++ - 在 void 指针中存储整数的往返安全性

在thisarticle关于整数和指针的reinterpret_cast提到了以下内容:(theround-tripconversionintheoppositedirectionisnotguaranteed;thesamepointermayhavemultipleintegerrepresentations)我的理解是否正确,标准不保证以下内容:intptr_tx=5;void*y=reinterpret_cast(x);assert(x==reinterpret_cast(y));有人可以确认吗? 最佳答案 您的解释是正确的

c++ - 解压函数调用的参数数组

是否可以将一个函数及其参数列表传递给另一个函数并稍后从内部调用它?voidtestA(int,float,char*){}voidtestB(int,float,double){}voidtestC(MyClass,float,double){}templatevoidapplyA(void(*foo)(void*),std::initializer_listargs){foo(/*unpackargssomehow*/);}templatevoidapplyB(void(*foo)(void*),std::initializer_listargs){MyClasscls;foo(cl

c++ - 在静态库中调用 main 之前的函数

我有一个类型注册系统,用于自定义形式的运行时类型信息。到目前为止,我已经使用以下宏在main之前调用注册函数并注册类型:#defineREGISTRATION\staticvoid_register();\namespace{structtemp{temp(){_register();}};}\staticconsttempCAT(temp,__LINE__);\staticvoid_register()这样我就可以在许多不同的cpp文件中执行此操作:REGISTRATION(){RegisterNewType(vec2)->RegisterMember("x",&vec2::x)->

c++ - 将返回 void 但具有整数参数的函数作为 ARGUMENT 本身传递给另一个函数

我最近开始使用c++开发OpenCV。我在使用以下代码时遇到问题。#include"cv.h"#include"highgui.h"intg_slider_position=0;CvCapture*g_capture=NULL;voidonTrackbarSlide(intpos){cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);}intmain(intargc,char**argv){cvNamedWindow("Example3",CV_WINDOW_AUTOSIZE);g_capture=cvCreateFil