草庐IT

@Async失效情况

全部标签

c++ - 为什么在这种情况下 c++ 模板参数推导失败?

我正在尝试编写自己的委托(delegate)系统来替代boost::functions,因为后者做了很多我认为有问题的堆分配。我已经写了这个作为替换(简化,实际使用池内存和新位置,但这很简单,可以重现错误):templatestructDelegateFunctor:publicMyFunctor{DelegateFunctor(void(*fptr)(A,B),Aarg1,Barg2):fp(fptr),a1(arg1),a2(arg2){}virtualvoidoperator()(){fp(a1,a2);}void(*fp)(A,B);//Storesthefunctionpoi

c++ - 在这种情况下,为什么 g++ 和 clang 会破坏 namespace 抽象?

编译:structstr{};namespacea{voidfoo(strs){}}namespaceb{voidfoo(strs){}voidbar(strs){foo(s);}}intmain(int,char**){return0;}但这不是(将结构定义移到命名空间a内)namespacea{structstr{};voidfoo(strs){}}namespaceb{voidfoo(a::strs){}voidbar(a::strs){foo(s);}}intmain(int,char**){return0;}我得到的错误是bad.cpp:Infunction‘voidb::b

C++:在不违反 SRP 的情况下向多态类层次结构添加方法?

我经常遇到一个设计问题。为了便于说明,我们假设我有一个多态类层次结构classA{public:virtual~A(){}...};classB:publicA{...};classC:publicB{...};classD:publicA{...};...我希望能够以多态方式打印这些类的实例,即每个类都有自己的打印方式。实现这一点的明显方法是添加virtualvoidprint(OutputStream&os)=0;进入基类并在每个子类中覆盖此方法。但是,如果类的原始职责与打印无关,这将给它们增加另一个职责,从而违反了SRP。.我的问题是:在不违反SRP的情况下实现所需行为的正确方法

c++ - 在没有 typedef 的情况下在 C++ 中返回函数指针时出错

我试图在不使用typedef的情况下返回指向函数的指针,但编译器(gcc)发出了一个奇怪的错误,就好像我无法进行那种设置一样。备注:使用typedef代码有效。代码:voidcatch_and_return(void(*pf)(char*,char*,int&),char*name_one,char*name_two,int&number)(char*,char*,int&){pf(name_one,name_two,number);returnpf;}错误:'catch_and_return'声明为返回函数的函数你能给我解释一下为什么编译器不允许我这样做吗?谢谢!

c++ - 在 C++ 映射中,有没有办法在给定值的情况下搜索键?

在C++std::map中,有什么方法可以在给定映射值的情况下搜索键?示例:我有这张map:mapmyMap;myMap[0]="foo";在给定值"foo"的情况下,有什么方法可以找到相应的int吗?cout 最佳答案 std::map不提供(快速)查找给定值的键的方法。你想要的通常被称为“双射映射”,或简称“双映射”。Boosthassuchadatastructure.这通常是通过使用“粘合”在一起的两个索引树来实现的(其中std::map只有一个用于键)。Boostalsoprovidesthemoregeneralmult

C++ 在不重新分配的情况下删除 vector 末尾的一部分

查看C++vector文档,pop_back()是一个不会导致vector数据重新分配的函数。但是,这仅适用于删除vector的一个成员。我试图找到一种方法来从vector的末尾删除多个成员。最初我以为我会在一个小的for循环中调用pop_back()但我在徘徊是否有更方便的函数可以为我做这个?编辑:Cplusplusvectorerase()reference并不像juanchopanza指出的那样清楚。这就是为什么我最初放弃使用erase()的原因。毕竟删除,效果很好。 最佳答案 使用vector::erase。它不会重新分配内

c++ - 如何在不重复代码而仅更改解析函数的情况下模板化函数?

我有一个现有的函数,可以将逗号分隔的数字字符串转换为vector,例如“1,2,3”变为[1,2,3]函数看起来非常粗略:boolConvertStringToNumberList(stringinput,vector&output){int32_tvalue=strtol(str,0,/*base*/10);}我想将其更改为适用于int32_t、uint32_t、double和float的模板函数。问题在于,对于每种数据类型,都有不同的解析函数(例如strtol、strtoul、strtod、strtof)可能采用不同数量的参数(例如strtod()不采用“基本”参数).如何在不重复

c++ - std::async "store"如何成为任意异常?

我无法理解std::async怎么可能存储任何异常,而不仅仅是从std::exception派生的东西。我玩弄了下面的代码#include#include#includevoidf(){std::coutfut=std::async(std::launch::async,f);std::cout我异步启动f(),然后在f中抛出一个int。神奇的是,这个int被std::async返回的future捕获并存储。我知道可以在std::async中catch(...)异常,但后者如何在不知道异常类型的情况下存储它?异常不是从某个基类派生的(在这种情况下,可能可以通过一些Base::clone

c++ - 在这种情况下我们需要禁用默认的复制构造函数和赋值运算符?

如果我们将复制构造函数和赋值运算符设为私有(private)且不提供任何实现,它们将被禁用,如下所示:classTest{private:Test(constTest&);Test&operator=(constTest&);};但在什么情况下我们需要这样做?我的意思是我们什么时候应该这样做? 最佳答案 当您希望此类的对象不可复制时。当对象不能或不应该被复制到其他对象时,可能有很多原因。几个例子是:日志文件一些突变体单例模式对象工厂一些版本的智能指针对于上述示例,编译器提供的默认复制构造函数和默认赋值运算符版本可能会导致意外结果。c

c++ - 在没有 C++ 11 的情况下使用 char16_t、char32_t 等?

我想要固定宽度的类型,包括字符类型。提供整数类型,但不提供字符类型,除非在使用C++11时,这是我做不到的。是否有一种干净的方法来定义这些类型(char16_t、char32_t等)而不与C++11定义的类型发生冲突,以防源代码与C++11混合?谢谢你:) 最佳答案 我认为,检查是否支持这种类型是平台相关的事情。例如,GCC定义:__CHAR16_TYPE__和__CHAR32_TYPE__如果提供了这些类型(需要ISOC11或C++11支持)。但是,您不能直接检查它们的存在,因为它们是基本类型,而不是宏:InC++,char16_