草庐IT

MYLIB_FUNCTION_ATTRIBUTE

全部标签

c++ - 如何使用 std::function<void(void)> 调用方法

我正在尝试使用一种方法std::function作为输入。不幸的是,我以前从未使用过这种数据类型,而且我在理解它时遇到了问题。我需要做的就是在它被调用时说出执行一个方法,例如:std::functiondoThing=object.isMethod();虽然这个语法显然是不正确的。有人可以向我解释一下吗? 最佳答案 你可以bind方法的对象std::functiondoThing=std::bind(&type::isMethod,&object);或使用lambdastd::functiondoThing=[&]{object.i

C++ 虚函数 : Can the linker remove entries in the virtual function table which aren't called?

这个问题是对eliminateunusedvirtualfunctions的一种跟进,这对我的兴趣来说还不够深入。问题:在定义具有虚函数的类时,编译器为虚函数表分配存储空间,并在表中存储指向函数的指针。这会导致链接器保留这些函数的代码,而不管它们是否被调用过。这可能会导致大量死代码保留在可执行文件中,即使编译器优化设置要求消除死代码也是如此。现在,如果在可执行文件中没有任何地方有特定虚函数的调用(或者换句话说,访问虚函数表的相应槽),则可以从虚函数中省略相应的函数指针表,链接器将删除该函数的代码,并可能进一步省略其他未引用的代码。显然,这不能由编译器完成,因为只有在链接时才会清楚是否调

c++ - 重载 std::function 参数以匹配 lambda

这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Disambiguatingcallstofunctionstakingstd::functionsIsn'tthetemplateargument(thesignature)ofstd::functionpartofitstype?我想重载一个函数,以便可以使用各种不同的lambda自然地调用它(通常有更多或更少的参数)。我尝试过的显而易见的事情是:#include#includeexternvoidfn(std::function);externvoidfn(std::function);voidtest

c++ - 我可以在编译时检测到 "function arguments"是编译时常量吗

我可以在编译时检测“函数参数”1是否是编译时常量吗?例如,函数print(inti)如果调用print(5)可以打印"constant5"但是"non-constant5"如果作为print(i)调用,其中i是一些非常量变量。特别是,在“isconstant”分支中,我应该能够将i视为constexpr,包括将其用于模板参数等。宏技巧、模板元编程和SFINAE技巧都可以。理想情况下它是可移植的,但特定于编译器的解决方案总比没有好。如果存在“假阴性”也没关系-即,如果常量值有时被检测为非常量(例如,当某些优化被禁用时)。如果解决方案可以检测到常量值何时被间接传递给函数(例如,当常量值被传

c++ - Clang 与 MSVC : Treatment of template function prototypes

下面是一段测试代码,我分别用MSVC和Clang来对比编译结果。每个编译器的输出如下所示。MSVC假装未使用的模板声明甚至不存在。Clang产生错误。问题是,哪个编译器在这里最符合标准?我见过依赖MSVC行为的遗留生产代码,但我不确定它是否可以继续依赖。classS{structP{};};templateS::PBat(T);在MSVC10中干净地编译:E:\clangbuild\bin\Release>cl/c/nologotest.cpptest.cpp在Clang中产生错误:E:\clangbuild\bin\Release>clang++test.cpptest.cpp:9:

c++ - GCC 的函数 __attribute__ 是否与虚函数一起使用?

GCCC++编译器通过functionattributes提供了一系列扩展,例如:intsquare(int)__attribute__((const));特别是两个属性,const和pure,允许您声明一个函数的计算没有副作用并且只依赖于它的参数(const),或仅在其参数和全局变量上(pure)。这允许消除公共(public)子表达式,这可能会导致调用此类函数的次数少于其在代码中编写的次数。我的问题是这是否可以安全、正确和明智地用于虚拟成员函数:structFoo{virtualintsquare(int)__attribute__((pure));//doesthatmakese

c++ - "control reaches end of non-void function"枚举类型完全处理大小写切换

为什么即使处理了type_t的所有可能值,此代码也会触发“控制到达非空函数的结尾”?处理此警告的最佳方法是什么?在切换后添加return-1?(代码测试here)typedefenum{A,B}type_t;intuseType(type_tx){switch(x){caseA:return0;caseB:return1;}}相关:Detectingifcastinganinttoanenumresultsintoanon-enumeratedvalue 最佳答案 一般来说,enum不是唯一的。例如,有人可以像useType((ty

c++ - std::is_function 不将模板参数识别为函数

我将函数指针传递给函数模板:intf(inta){returna+1;}templatevoiduse(Ff){static_assert(std::is_function::value,"Functionrequired");}intmain(){use(&f);//Plainfdoesnotworkeither.}但是is_function无法将模板参数F识别为函数,因此静态断言失败。编译器错误消息指出F是int(*)(int),它是指向函数的指针。为什么会这样?在这种情况下,我如何识别函数或指向函数的指针? 最佳答案 F是一个

c++ - c++ typedef std::function<> 如何使用?

你好,我正在做这个项目,在头文件中定义了以下内容typedefstd::functionHashFunction;我如何将它与我的HashFunction一起使用?当我尝试HashFunctionmyHashFunction;myHashFunction("mystring");程序崩溃。 最佳答案 std::function类型的对象行为非常像一个函数指针,指向一个带有签名Signature的函数.默认构造std::function只是还没有指向任何函数。std::function之间的主要区别和一个函数指针Signature*是

c++ - 删除自身内的 std::function 对象

这是明确定义的行为吗?#includevoidfoo(){autof=newstd::function;*f=[f](){deletef;};(*f)();f=nullptr;}intmain(){foo();}使用最新的g++,如果我在模板中执行此操作,则在valgrind下运行时会导致无效读取,否则它会正常工作。为什么?这是g++中的错误吗?#includetemplatevoidfoo(){autof=newstd::function;*f=[f](){deletef;};(*f)();f=nullptr;}intmain(){foo();} 最佳答案