草庐IT

string-comparison-functions

全部标签

c++ - 错误 : 'Failed to specialize function template' C2893 'std::invoke'

我正在VisualStudio2013中编写MFC程序,但我不断收到以下两个错误错误C2893无法特化函数模板'unknown-typestd::invoke(_Callable&&,_Types&&...)'和错误C2672“std::invoke”:找不到匹配的重载函数错误与文件xthread第238行有关我是c++/MFC的新手,我正在尝试编写一个将在后台运行到系统时间的函数。这是我使用的代码:voidtask1(ExperimentTab&dlg){while(true){CStringshowtime=CTime::GetCurrentTime().Format("%H:%M

c++ - std::function vs Lambda 用于传递成员函数

我正在为游戏引擎创建一个消息系统,引擎的最终用户可以在其中创建消息对象并将其传递给游戏对象,以由包含附加到游戏对象的组件的监听器对象进行解释。如果消息与监听器正在监听的消息相匹配,则监听器应调用函数指针并将接收到的消息传递给它。基本结构看起来像这样:classMessage{std::stringmessage;};classListener{std::stringtarget;void(*fn)(Message*);};使用游戏对象的代码来接收如下所示的消息://ifthequeueisemptythendontdoanythingif(messageQueue.empty()){r

c++ - glGetShaderInfoLog 到 std::string?

这是OpenGLSuperBible第7版的片段:GLintlog_length;glGetShaderiv(fs,GL_INFO_LOG_LENGTH,&log_length);std::stringstr;str.reserve(log_length);glGetShaderInfoLog(fs,log_length,NULL,str.c_str());乍一看,将str.c_str()作为参数传递给这个函数似乎很奇怪,当然clang立即抗议:cannotinitializeaparameteroftype'GLchar*'(又名“char*”),右值类型为“constchar*”。

c++ - 删除元素后 std::string 容量保持不变,那么它是否占用了一些内存?

下面这段代码:stringa="abc";cout...输出:33即使我从字符串中删除一些元素,容量也保持不变。所以我的问题是:是否有一些内存因为容量问题而被占用?如果我没有明确地reserve()怎么办?如果我使用reserve()并且没有用完整个容量,我是不是在浪费内存?如果需要,这些额外的内存(我没有使用)是否会分配给其他东西?编辑:假设我有stringa="something";a="ab";现在我知道a永远不会超过两个字符。那么调用reserve(2)这样内存就不会被浪费是明智的吗? 最佳答案 我先回答你的问题:内存属于字

c++ - 将 lambda 转换为 std::function 时强制执行常量正确性

我有一个函数将std::function作为参数。但是,我想确保传入的函数不允许修改传递给它的参数。下面是该函数的简单版本(注意T可以而且通常是引用):templatevoidBar(std::function)>func){//...}错误用法:Bar([](int&){/*Donastystuff!*/});/*A-OK!*/我想禁止这种用法,但这段代码编译得非常好,即使我觉得它不应该。有趣的是,如果我去掉模板参数,即:voidBar(std::functionfunc){//...}那么,这个用法就不会编译(因为它不应该):Bar([](int&){/*Donastystuff!

c++ - 将函数指针传递给函数时处理 <unresolved overloaded function type>

让我们考虑一下:voidgoo(){std::cout现在我想使用如下定义的一些包装函数来调用其中一个函数:templatevoidc(F&&f,A&&...a){f(std::forward(a)...);}使用方法:c(&goo,10);//(X)c(&goo);//(Y)两种情况都失败(GCC5.3.1)并出现相应的错误:error:nomatchingfunctionforcallto‘c(,int)’error:nomatchingfunctionforcallto‘c()’就我而言,失败是因为编译器在必须初始化f对象时无法选择适当的重载(信息太少)。作为一种解决方案,我当然

c++ - 无法推导 std::function 模板参数

我正在编写如下代码#includetemplatevoidfoo(conststd::function&handler){}voidgoo(constint&){}intmain(){foo([](constint&){});foo(goo);}不幸的是,由于以下错误,它拒绝在(clang6.0.0和gcc8.1.1)上编译candidatetemplateignored:couldnotmatch'function'against'(lambdaattest3.cpp:13:9)'candidatetemplateignored:couldnotmatch'function'agai

c++ - Windows 上的慢速 std::string 连接

我有一个程序需要将许多字符串连接在一起(更准确地说是将整数转换为字符串)。在我的Ubuntu机器上(运行g++7.3.0),代码运行时间为1.5秒。但是代码也需要在Windows上运行(使用MinGW运行g++6.3.0),需要15秒才能完成。此外,Ubuntu设置在使用i7-4712MQCPU@2.30GHz的慢得多的笔记本电脑上运行,而Windows机器在i7-7700KCPU@4.20GHz上运行。重现时间的代码如下所示。我用g++tester.cpp-O2-otester(或tester.exeforwindows)编译代码#include#includeintmain(int

c++ - 为什么 `std::is_function_v` 没有按预期工作?

#include#include#includeusingnamespacestd;templateboolf(T&&v){returnis_function_v(v))>;}intmain(){cout输出是:(clang6.0&gcc8.0)>truefalse但我期望的结果应该是:>truetrue为什么std::is_function_v没有按预期工作? 最佳答案 您需要删除对T的引用。templateboolf(T&&v){returnis_function_v(v))>>;//~~~~~~~~~~~~~~~~~~}当se

c++ - 将 std::function 与模板一起使用

所以在最精炼的形式中,我有这样的事情发生,templateboolf(constT&a,constT&b,std::functionfunc){returnfunc(a,b);}templateboolg(constT&a,constT&b){returntrue;}但是任何调用f()的尝试,f('a','b',g),f(1,2,g),总是导致“没有匹配的函数调用‘f’”,无论我是将变量作为const引用传递还是只是普通值或其他什么。我假设它无法推断出某些模板,但我不知道在哪里或为什么。我承认,我对一般情况下如何使用函数对象的把握非常薄弱,这样做有可能吗?