Which Singleton library in BOOST do you choose?
谷歌搜索结果显示Boost中有超过1个单例模板/基类,您建议使用哪一个?
- 单身汉是邪恶的。它们只是政治上正确伪装的全局变量!
- 为了提供一个背景,jalf把它放得很好,例如:stackoverflow.com/questions/86582/…(我认为他在其他地方做了更多的阐述,但现在找不到)。
- @女朋友:我想到目前为止,我已经在至少十几个不同的问题中提出了这一点。;)这里(stackoverflow.com/questions/1020312/…)是另一个。据他的博客(blackninjagames.com/?)显示,显然我也把gman转变成了我的观点。p=24),但现在找不到它所基于的线程。:)是的,虽然它可能无法回答OP的问题,但我会说"不要在Boost中使用任何单例类"。:)
- @gf@jalf:it was this one:stackoverflow.com/questions/2080233/…
- @贾夫:也许你可以在一篇可以参考的博客文章中详细阐述一下?:)@gman:啊,谢谢。
- 如果单身汉是邪恶的,我是上帝吗?:)
- 单件工厂?程序是否需要工厂的多个实例?工厂是全局对象。我将单例用于工厂和管理者(管理事物的对象)。
- 工厂也可以是本地的(并注入DEP)。
- @托马斯:如果你只需要一个,那就用一个。除了混淆代码之外,您没有必要阻止进一步的实例化。
- @托马斯:你怎么知道你的程序永远不需要一个以上的工厂实例?如果你错了怎么办?如果不是单例实例,我可以创建一个实例,如果发现我错了,需要两个实例,我可以创建另一个实例。对于单身,我有一个例子,如果我发现我需要两个,我就完蛋了。为什么要硬编码该类以防止自己创建多个实例?它能防止错误吗?你经常不小心创建多个工厂吗?
- @我不太喜欢把我的代码拟人化。我不喜欢认为代码构造是"邪恶"或"好"或"有福"(或者说是"臭味")。对于一个你一开始从来没有真正解决过的问题来说,单身总是一个错误的解决方案。我不排除它是正确工具的情况存在,但我想不出它可能是什么。至于迪,我也不太喜欢。这很方便,但是它也是一个很好的方法,可以让你失去对依赖性的跟踪,并削弱类不变量。说到迪,我就站在围栏上了。有用,但很难"祝福":)
- ……当心,臭气熏天的单身汉,传福音的来了!:)【我这里没有具体的人,只是开玩笑而已】
- @gf:你的愿望是我的命令:jalf.dk/blog/2010/03/…;)
- @JALF:我有一个第三方设备API,它要求在同一个thead中进行所有调用,我需要在多线程应用程序中同时使用这些调用。解决方案:使用跨线程调用并在专用线程中运行所有设备交互。我的线程需要是单线程,否则我的应用程序会被烧掉。
- @彼得森:这没道理。一条线怎么可能是一个单体呢?将该API包装在一个将所有调用封送到单个API线程的东西中是有意义的。但是没有理由要在一个单独的地方完成。
- @不好意思,我本可以说得更清楚的:与线程相关联的数据,至少是线程句柄,或者您用来确定线程的任何数据结构已经存在,以及如何与之通信。
你不应该在Boost中使用单件,它们只用于内部目的(参见单独libes的"detail"文件夹)。这就是为什么你还没有在Boost网站上公开单件图书馆的原因。
singleton类的实现非常简单,但在特定情况下有许多变体是有用的,因此您应该使用符合您认为singleton行为方式的变体。
现在,还有其他的库提供singleton,最通用的是loki。但它会让你心烦意乱;)
更新:现在有一个被提议的库称为奇点,目的是提供非全局的单例(可以选择使它成为全局的),迫使你有明确的对象的创建和破坏点。
查看查看请求:http://boost.2283326.n4.nabble.com/review-request-singularity-tt3759486.html
一些Poost DEVs似乎考虑使用它代替一些黑客,但是C++ 11使一个类单体比以前更容易,所以它将取决于审查。
我的Boost版本有以下singleton.hpp头文件:
1 2 3
| C:\boost_1_38_0\boost\pool\detail\singleton.hpp
C:\boost_1_38_0\boost\serialization\singleton.hpp
C:\boost_1_38_0\boost\thread\detail\singleton.hpp |
我没有用过这些,但我可能会远离详细目录中的那些。
不管怎样,http://torjo.com/tobias/index.html boost-utility_singleton.reference.singleton看起来像是要使用的工具,但它似乎不是boost的一部分(还没有被接受?).