草庐IT

c++ - 我是否正确理解了 Scott Meyers 的 std::weak_ptr 示例的要点?

EffectiveModernC++(第136页)使用以下示例来激发std::weak_ptr。缓存被定义为一个无序的映射,具有指向对象的弱指针作为值。每当此缓存的客户端请求一个对象(通过键)时,就会查找相应的弱指针并在其上调用lock()。如果生成的std::shared_ptr不是null,则返回它。否则,对象从外部数据库重新加载,进入缓存并返回std::shared_ptr。现在的问题是:人们可能认为可以在没有std::weak_ptr的情况下实现这一点,而是将强共享指针存储为缓存值。如果强指针的use_count()为1,则表示客户端的所有指针都已销毁。这个例子的重点是使用st

c++ - Meyers 单例和动态库

MeyersSingleton是否适用于有动态库的场景?IE。一个定义单例的库,其他人使用它,每个都在自己的编译单元中?(我想这无关紧要,但具体架构是OSX上带有框架的应用程序)我正在使用VanillaMeyersSingleton模式:以下Instance()方法是在实用程序类的头文件中内联定义的(在动态库中定义):staticLogger&Instance(){staticLoggersingletonInstance;returnsingletonInstance;}复制构造函数和operator=被声明为私有(private)且未实现,所以我们应该很好,对吧?现在,如果我从主应

c++ - Meyers Singletons 的销毁顺序

到以下代码:classC{public:staticC&Instance(){staticCc;returnc;}~C(){std::cout我有几个问题:销毁调用的顺序是否定义明确?(即使类C和D定义在不同的源文件中)如果定义明确,此行为是否可移植? 最佳答案 这个构造的要点是强加一个构造顺序(因此也是一个销毁顺序)。建筑由于这些是局部静态变量,构造顺序由它们各自的Instance函数第一次被调用的顺序决定。因为这是在main中完成的,所以构建顺序是完全指定的。使顺序未指定的唯一方法是在不同翻译单元的静态初始化中使用它们,例如,如

c++ - Scott Meyers 关于偏好非成员非友元方法的建议是否适用于对象构造?

假设我有一个类:classC{intx_;inty_;public:C(intx,inty):x_(x),y_(y){}};然后我想从一个字符串中添加结构,它只会解析x和y。在阅读Meyers的书之前,我通常会将它作为C类中的另一个构造函数。但是,也可以使其成为非成员(member)非好友:CCFromString(conststd::string&s){intx,y;//...parsethemsomehow,throwexceptionifneeded...returnC(x,y);}对我来说,这是许多“值类”的标准情况,当有一个“主”构造函数将私有(private)成员设置为提供

C++: Scott Meyers "Effective STL": item 31: know your sorting options: 帮助理解

美好的一天!ScottMeyers在他的“EffectiveSTL”中写道第三种方法是使用有序的迭代器容器中的信息,以迭代方式将列表的元素拼接到您希望它们所在的位置。如您所见,有很多选择。(第31项,第二部分)有人可以这样解释吗?更多文字(理解上下文):算法sort、stable_sort、partial_sort和nth_element需要随机访问迭代器,因此它们只能应用于vector、字符串、双端队列和数组。对标准关联容器中的元素进行排序是没有意义的,因为此类容器使用它们的比较函数来始终保持排序。我们可能想使用sort、stable_sort、partial_sort或nth_el

c++ - Scott Meyers 第二版关于在 Effective C++ 中实现 nullptr 的一些问题?

const//Itisaconstobject...classnullptr_t{public:templateinlineoperatorT*()const//convertibletoanytypeofnullnon-memberpointer...{return0;}templateinlineoperatorTC::*()const//oranytypeofnullmemberpointer...{return0;}private:voidoperator&()const;//Can'ttakeaddressofnullptr}nullptr={};operatorT*()co

c++ - Meyers 的单例实现实际上是如何实现单例的

我已经阅读了很多关于单例的文章,它们应该在什么时候使用,什么时候不应该使用,以及如何安全地实现它们。我正在用C++11编写,并且遇到了Meyer的单例延迟初始化实现,如thisquestion.中所示。这个实现是:staticSingleton&instance(){staticSingletons;returns;}我了解这对于SO上的其他问题来说是线程安全的,但我不明白这实际上是一个单例模式。我已经用其他语言实现了单例,这些总是像Wikipedia中的这个例子一样。:publicclassSingletonDemo{privatestaticvolatileSingletonDem

c++ - Meyers 实现的 Singleton 模式线程安全吗?

Singleton(Meyers的Singleton)线程的以下使用延迟初始化的实现是否安全?staticSingleton&instance(){staticSingletons;returns;}如果不是,为什么以及如何使其线程安全? 最佳答案 在C++11,它是线程安全的。根据standard,§6.7[stmt.dcl]p4:Ifcontrolentersthedeclarationconcurrentlywhilethevariableisbeinginitialized,theconcurrentexecutionsha