草庐IT

替代者

全部标签

c++ - 将 weak_ptr 与原始指针进行比较不起作用,正在寻找替代方案

我有一个SpriteManager类,它为我加载和缓存Sprite,并从缓存中删除未使用的Sprite。无论如何,这就是我的想法,我有点卡住了。我有一个map>我在其中存储Sprite,并使用weak_ptr生成shared_ptr的。现在我正在尝试使用一个删除器,它也从map中删除位图,它看起来像这样(显然不起作用):[&bitmaps](ALLEGRO_BITMAP*bmp){for(autoit=bitmaps.begin();it!=bitmaps.end();++it){if((*it).second==bmp){bitmaps.erase(it);al_destroy_bi

c++ - 动态分配数组的 unique_ptr 替代方案

我写了一个类,它必须与一些需要一些C风格数组(或至少指向第一个元素的指针)作为参数的旧代码接口(interface)。这些数组是我类的成员,它们特别大(50kb)所以我想把它们放在堆上,这样我类的对象在堆栈上就不会很大。我非常相信使用资源管理对象,所以我宁愿自己不在堆上管理这些数组。我发现使用unique_ptr的效果特别好。例如:std::unique_ptrsomeArrayName并使用:someArrayName(newSOMETYPE[someLargeSize])在我的构造函数的初始化列表中。这允许我使用.get()将它们用作常规C数组需要它作为参数的函数的方法,我不必自己

c++ - map 、集合等的 array_view 替代方案

假设我有一些类层次结构,其中有几个virtual返回容器引用的函数:#include#include#include#include#includeclassInterface{public:virtualconststd::vector&getArray()const=0;virtualconststd::set&getSet()const=0;virtualconststd::map&getMap()const=0;};classSubclassA:publicInterface{public:conststd::vector&getArray()constoverride{ret

c++ - unique_ptr refcount 的替代方案

在下面的代码示例中,只要B的任何对象存在,就应该在structB中存在一个structA的实例.示例按预期工作。#include#include#includestructA{A(){std::coutguard(mtx);if(!refCount){a.reset(newA);}++refCount;}~B(){std::coutguard(mtx);--refCount;if(!refCount){a.reset();}}staticstd::unique_ptra;staticstd::mutexmtx;staticintrefCount;};std::unique_ptrB::

c++ - shared_future<void> 是 condition_variable 的合法替代品吗?

Josuttis指出[“标准库”,第2版,第1003页]:Futuresallowyoutoblockuntildatabyanotherthreadisprovidedoranotherthreadisdone.However,afuturecanpassdatafromonethreadtoanotheronlyonce.Infact,afuture'smajorpurposeistodealwithreturnvaluesorexceptionsofthreads.另一方面,shared_future可以被多个线程使用,以识别另一个线程何时完成了它的工作。另外,一般来说,高级并发

c++ - C++ 中的堆栈对象创建 - 替代语法

这个问题在这里已经有了答案:关闭11年前。PossibleDuplicate:WhatdothefollowingphrasesmeaninC++:zero-,default-andvalue-initialization?我对C++中的一个问题感到困惑。当使用默认构造函数在堆栈上创建对象时,我认为以下两种语法符号中的任何一种都会给出相同的结果:classMyClass{public:inti;}intmain(){MyClassa=MyClass();MyClassb;}但是,第一个语法将字段初始化为零,而第二个语法使字段未初始化。所以我的问题是:为什么会这样?我认为C++中的字段不

c++ - 如何在 C++ 中创建动态 DLL 库,以替代遗留的 Fortran DLL

我必须在C++中创建一个动态DLL库,以替代用Fortran编写的旧DLL库,而无需更改主机应用程序(因此函数和参数必须保持不变)。我有那个库中所有Fortran函数的完整规范,但是我需要使用什么工具(编译器),以及在这种情况下编码DLL的方式是什么(stdcall、cdecl、dllexport等-这些线索没有不用多说,我以前从未创建过DLL)。这是遗留DLL中的示例Fortran函数声明:SUBROUTINESetBoundaries(MaxFlow,MinFlow)cDEC$ATTRIBUTESDLLEXPORT::SetBoundariescDEC$ATTRIBUTESALIA

c++ - istrstream 的更好替代品?

istrstream非常适合我的需求-基本上,采用固定的字符缓冲区,并给我一个简单的方法来提取行getline()并测试eof()我正在将我们的项目切换到C++17合规性-它已弃用istrsteam-显然是因为有太多C++程序员无法理解固定缓冲区内存管理(你是认真的吗?!)无论如何,istringstream提供相同的使用语义,但它强加了现在在构造时复制整个固定字符缓冲区的需要。这是一个反模式。我正在寻找的是一种使用string_view代替istringstream的string的方法,或者更好的方法stringstream的替代品,它本身处理外部管理的固定缓冲区(它只需要指向它,它

C++ 单例 : how good is this solution? 优点/缺点,替代方案

我正在开发一个包含多个类的C++项目,这些类必须是单例,它们之间存在依赖关系(初始化顺序很重要)。我想出了这个解决方案:所有我想成为单例的类都有protected构造函数,例如:classMySingleton1{protected:MySingleton1();}有一个源文件singleton_factory.cpp包含一个实例化类Singletons,它派生自所有我想成为单例的类,像这样:#include"MySingleton1.hpp"#include"MySingleton2.hpp"classSingletons:publicMySingleton1,publicMySin

c++ - C++ 类成员的替代实现语法

在C++中声明和实现类或结构时,我们通常会这样做:H文件namespaceSpace{classSomething{voidmethod();}}CPP文件voidSpace::Something::method(){//dostuff}或namespaceSpace{voidSomething::method(){//dostuff}}请注意如何将所有实现包装在namespaceblock中,这样我们就不需要在每个成员之前编写Space::。有没有办法以类似的方式包装类(class)成员?请注意我想将源文件和头文件分开。这通常是一个很好的做法。 最佳答案