`enable_shared_from_this`的用处是什么?
我在阅读boost.asio示例时遇到了enable_shared_from_this,在阅读文档后,我仍然为如何正确使用它而丢失.有人可以给我一个例子并解释使用此类课程是有道理的. 解决方案 当您拥有的只是this时,它使您可以将有效的shared_ptr实例获得到this.没有它,除非您已经有一个成员,否则您将无法将shared_ptr> shared_ptr.此示例来自class Y: public enable_shared_from_this { public: shared_ptr f() { return shared_from_this(); } } int main() { shared_ptr p(new Y); shared_ptr q = p->f(); assert(p == q); assert(!(p
10 2024-04-02
编程技术问答社区
用Boost.TR1替换VS 2010 (VC10)的本地tr1库
我一直在std :: tr1命名空间中使用boost.tr1使用VS 2005(VC8),通过设置VS的Incluble Directories来确定boost tr1标头,如所述现在,我正在转到VS 2010(VC10),我似乎使用相同的方法来汇编错误. 包括目录设置为: [boost-root] \ boost \ tr1 \ tr1 [boost root] VC标准包括目录 示例代码: #include #include int main(int argc, char ** argv) { std::cout (), 5, std::tr1::placeholders::_1)(5) ------ Rebuild All started: Projec
10 2024-04-02
编程技术问答社区
std::[tr1::]ref和boost::ref之间的混淆
当心:这是GCC 4.1.2.我们在专有的嵌入式平台上.我们无法更新到新的编译器.因此C ++ 03+Tr1是. 我们的某个地方具有这样的函数: template void foo(const boost::any& x) { bar(boost::any_cast(x)); } 随后在绑定表达式中使用: std::tr1::bind( &foo, _1); 这会生成以下错误: error: call of overloaded 'ref(const boost::any&)' is ambiguous note: candidates are: std::tr1::reference_wrapper std::tr1::ref(_Tp&) [with _Tp = const boost::any] note: const boost::reference_wrapper boost::ref(T&)
20 2024-04-02
编程技术问答社区
在C++11正则表达式中是否有match_partial?
我通过 N1429 P> 算法REGEX_MATCH和REGEX_SERZER都支持正则表达式库中常见的功能:部分匹配.当标志在传递给算法的标志中设置标志 std::regex_constants::match_partial 时,如果匹配一个或多个字符,则可以返回真实的结果,然后状态机到达字符的末端序列虽然仍有状态匹配. [...] ,但我找不到FCD中的任何痕迹,也找不到当前GCC-4.7.0的标题.我还寻找了N1429的修订版,但没有发现任何东西.我知道该提案的基础起源于Boost,并将其纳入TR1.但是我不知道match_partial何时消失. 部分匹配功能是否仍在C ++ 11中?也许有其他名称? 解决方案 看来,match_partial标志在 n1723 "提出的库tr问题的决议" (2004 oct)作为 n1507 "正则表达式提案" : 7.34 Match_partial标志的含义 删除match_partial. 根据
10 2024-04-02
编程技术问答社区
返回一个'指针',该指针需要由一个智能指针持有
我有一个项目,我想更多地利用智能指针.总的来说,我在这个目标方面取得了成功.但是,我遇到了一件事,我不确定"最佳实践"是什么. 基本上,我想从功能中返回一个"指针",但是需要用户将其固定在智能指针中.不仅如此,我不想授权特定的智能指针(共享与范围). 问题主要是,似乎没有适当的方法将A scoped_ptr升级到shared_ptr(我认为这是理想的解决方案).我了解他们为什么不这样做,因为这将允许转移所有权,这可能会导致一些问题. 但是,所有权的转让似乎是 this 案例的好主意.所以我的想法就是这样: // contrived example of factory pattern std::auto_ptr func() { return std::auto_ptr(new A); } 这起作用的"确定",因为scoped_ptr和shared_ptr都有从std::auto_ptr>. 获得所有权的构造函数 所以我的问题是,这是好习惯吗?
14 2024-04-02
编程技术问答社区
shared_ptr in std::tr1
我正在使用GCC编译器的平台上工作,但是Boost无法编译. 我想知道在GCC上将共享_ptr包含在std:tr1中的正确方法是什么?我所看的文件说不要直接包含它,我可以告诉其他文件包括:| 解决方案 in g ++ 4.3 , #include 应该解决这个问题.您会发现shared_ptr at std::tr1::shared_ptr. 其他解决方案 其他解决方案 提升不能在上面编译吗?大多数Boost库不需要编译,我猜我也不需要使用. 也不需要使用.
10 2024-04-02
编程技术问答社区
用std::tr1::函数(或boost::函数)创建多播事件
我正在尝试使用TR1的功能来创建类似C#的多播代表和事件.或Boost,因为BOOST ::函数(主要)与std :: Tr1 :: function相同.作为概念证明,我尝试了以下方法: template class Event { private: typedef std::tr1::function action; std::list callbacks; public: inline void operator += (action func) { callbacks.push_back(func); } inline void operator -= (action func) { callbacks.remove(func); } void operator ()(T1 arg1) { for(std::list::iterator iter = ca
6 2024-04-02
编程技术问答社区
std::function'的复制构造器是否要求模板类型'的参数类型为完整类型?
给定: #include class world_building_gun; class tile_bounding_box; typedef std::function worldgen_function_t; void foo() { worldgen_function_t v; worldgen_function_t w(v); } 应该编译吗?我的编译器说: 是:gcc/stdlibc ++(boost ::函数在GCC和clang中都是肯定的) 否:clang/libc ++( http://libcxx.llvm.org/截至今天,SVN) (如果"否"是正确的答案,我将修复我的真实代码以将完整的类型放入更多标题或使用boost :: function.) 编辑:这是叮当错误消息: In file inc
8 2024-04-02
编程技术问答社区
如何处理不断发展的c++ std::命名空间?例如:std::tr1::shared_ptr vs. std::shared_ptr vs. boost::shared_ptr vs. boost::tr1::shared_ptr
对于我当前正在处理的代码,有时我们需要在一些较旧的编译器的较旧的系统上编译(例如,我们在较旧的IBM Bluegene/L上运行SIMS,他的支持合同决定了一些旧的C ++编译器).代码本身使用共享_ptrs,最初是为使用std :: tr1 :: shared_ptr的.在旧的蓝晶机上编译时,我很快意识到它没有TR1 ::实现,因此我切换到boost :: shared_ptr.事实证明,还有一个boost :: tr1 :: shared_ptr.现在,该代码在我们的研究小组之外广泛使用,可移植性变得越来越重要. 在大型代码库中处理这些不断发展的标准库问题的最佳实践是什么?我假设在新的C ++ 11标准中,shared_ptr将不再位于TR1名称空间中,这增加了另一个潜在的潜力:std :: shared_ptr,但是我猜想对此广泛支持将是一条路.如果可能的话,我想使用最新标准,但需要保持便携性.我应该只是坚持吗? 解决方案 要检测共享_ptr所在的命名空间,您需要诸如
10 2024-04-02
编程技术问答社区
enable_if方法的专门化
template struct A { A operator%( const T& x); }; template A A::operator%( const T& x ) { ... } 如何使用enable_if使任何浮点类型(IS_Floating_point)进行以下专业化? template A A::operator%( const float& x ) { ... } 编辑: 这是我提出的答案,与下面发布的答案不同... template struct A { T x; A( const T& _x ) : x(_x) {} template typename std::enable_if::value && std::is_f
6 2024-04-02
编程技术问答社区
是否有一个标准的C++函数对象来拆解std::pair?
有人知道是否有feacto标准(即TR1或Boost)C ++功能对象用于访问STD :: PAIP的元素?在过去的24小时中两次我希望我有类似keys perl哈希功能的功能.例如,在std ::映射对象上运行std ::变换并将所有键(或值)转换到另一个容器将是很不错的.我当然可以写这样的功能对象,但我宁愿重复使用上面有很多眼球的东西. 解决方案 boost::bind是您要寻找的. boost::bind(&std::pair::second, _1); // returns the value of a pair 示例: typedef std::map map_type; std::vector values; // will contain all values map_type map; std::transform(map.begin(), map.end(),
6 2024-04-02
编程技术问答社区
TR1共享阵列
我很难在TR1文档中找到有关共享数组的参考.提升文档很清楚,C ++"新"和"新[]"表达式之间存在显着差异.共享_ptr模板旨在正确保存使用"新"创建的动态分配的反对的指针.共享_array模板旨在使用" new []. 我正在更新一些代码以使用tr1 shared_ptr模板和关联功能,但是我发现没有提及shared_array. tr1共享_ptr实现是否区分了"新"和"新[]",并正确销毁了这些指针?据我所知,从TR1规格看,它似乎没有.如果是这种情况,我是否应该使用boost shared_array模板进行" new []"样式分配? 解决方案 是正确的,tr1中没有共享_array. 但是,如果您希望使用此构造函数: template shared_ptr(Other* ptr, D dtor); 例如: template struct my_array_deleter
6 2024-04-02
编程技术问答社区
不同风格的shared_ptr之间的区别
移植到另一个人的开销或基本上是相同的? 解决方案 根据Boost网站,boost::shared_ptr ... ...符合TR1规范,唯一的例外是驻留在命名空间boost而不是std::tr1. . 根据wikipedia TR1实现缺少某些指针功能,例如混叠和指针算术,但是C ++ 0x版本会添加这些. 如果您的代码与TR1/Boost版本一起使用,则应与C ++ 0x版本一起使用(但不一定是VICE).
6 2024-04-02
编程技术问答社区
std、tr1和boost(作为命名空间和/或库)之间有什么区别?
我最初认为它们都是一样的,但事实证明这是错误的.那么,谁能简要地解释这三者之间的差异?例如: std::bind(最新的一个,下一代C ++) std::tr1::bind(旧,C ++ STD的扩展) boost::bind(完全独立的库) 或std::shared_ptr,std::tr1::shared_ptr和boost::shared_ptr,...等等 更新 bind,shared_ptr是有助于澄清我的问题的示例.我的目的是了解这三个名称空间之间的一般差异.在所有三个名称空间中都存在几个库,显然bind是一个例子,也是shared_ptr. 我应该坚持哪些名称空间?我个人更喜欢std::的库,因为它将是C ++的下一个标准(C ++ 0x). 解决方案 1- std::bind 是标准名称.这将是您用于C ++ 11兼容的库的名称.所有标准化C ++ . 中的库 2- std::tr1::bind是C ++技术报告1名称空间.在
4 2024-04-02
编程技术问答社区
tr1::reference_wrapper有什么用?
最近,我一直在阅读斯科特·迈耶斯(Scott Meyers)的出色书.在最后一个技巧之一中,他介绍了TR1的一些功能 - 我通过Boost认识了其中的许多功能. 但是,我绝对没有认识到:tr1 :: reference_wrapper. 我如何以及何时使用tr1 :: referent_wrapper? 解决方案 据我所知,这就像boost :: ref.基本上,可以复制的参考.与您需要通过参考传递参数的函数结合时非常有用. 例如(使用Boost语法): void Increment( int& iValue ) { iValue++; } int iVariable = 0; boost::function fIncrementMyVariable = boost::bind( &Increment, boost::ref( iVariable )); fIncrementMyVariable(); dobbs博士文
12 2024-04-02
编程技术问答社区
weak_ptr是如何工作的?
我了解如何使用weak_ptr和shared_ptr.通过计算其对象中的参考数量,我了解shared_ptr的工作原理. weak_ptr如何工作?我尝试阅读Boost源代码,但我对Boost还不够熟悉以了解其使用的所有内容. 谢谢. 解决方案 shared_ptr使用额外的"计数器"对象(又称"共享计数"或"控制块")来存储参考计数. (顺便说一句:那个"计数器"对象也存储了deleter.) 每个shared_ptr和weak_ptr包含一个指向实际点的指针,第二个指向"计数器"对象的指针. 要实现weak_ptr,"计数器"对象存储了两个不同的计数器: "使用计数"是指向对象的shared_ptr实例的数量. "弱计数"是指向对象的weak_ptr实例的数量,另外一个是"使用计数"仍然> 0. 当"使用计数"达到零时,将Pointee删除. 当"弱计数"达到零时,"计数器"辅助对象被删除(这意味着"使用计数"也必须为零,请参见上文).
6 2024-04-01
编程技术问答社区
为什么std::函数不具有平等可比性?
这个问题也适用于boost::function和std::tr1::function. std::function不是等于: #include void foo() { } int main() { std::function f(foo), g(foo); bool are_equal(f == g); // Error: f and g are not equality comparable } 在C ++ 11中,operator==和operator!=超载不存在.在早期的C ++ 11草案中,宣布过载被评论删除(N3092§20.8.14.2): // deleted overloads close possible hole in the type system 它没有说"类型系统中的可能孔"是什么.在TR1和BOOST中,宣布过载但未定义. TR1规范注释(N1836§3.7.2.6):
8 2024-04-01
编程技术问答社区
在标题中使用tr1::shared_ptr放在命名空间std中是否合法?
使用std::tr1::shared_ptr std::shared_ptr将指令放置在相应的标题中是合法和良好的编程样式吗?这样: namespace std { using tr1::shared_ptr; } 我知道污染整个命名空间是不好的,但是这种情况呢?有隐藏的陷阱吗?目标编译器为VS2008,但也需要与以后版本的兼容性. 解决方案 从技术上讲,标准表明,如果您这样做,则输入不确定行为的领域: 17.6.4.2.1名称空间std [namesp.std] 1如果添加声明或 定义命名空间std或命名空间中的名称空间 除非另有说明. 但实际上,您可能会摆脱它.哎呀,甚至斯科特·迈耶斯(Scott Meyers)在有效的C ++第三版中提出了一个类似未定义的名称空间的技巧. (项目54,p.268)使用boost功能作为缺少tr1功能的定格. namespace std { using namespace tr1 = ::boost;
6 2023-11-23
编程技术问答社区
在GCC和MSVC中使用TR1库
我想使用带有现代版本的GCC和MSVC的TR1库,但存在细微的差异:在GCC中,我必须说 #include std::tr1::shared_ptr X; 在MSVC中,我必须说 #include std::shared_ptr X; 我有两个问题:1)MSVC是否在C ++ 0x模式(相当于GCC的STD = C ++ 0x)中自动操作,或者默认情况下它也可以在C ++ 98/03模式下工作? 2)如何统一包含和名称空间?我正在考虑一个" include_tr1(内存)"或类似的预处理器宏. 要澄清,我想使用传统的标准C ++ 98/03; 不是 c ++ 0x(否则没有问题). 我对任何建议都非常感谢! 解决方案 好吧,在bost.tr1遇到了几个不一致且难以置信的问题之后,尤其是在尝试使用GCC的本机TR1库时,我决定完全抛弃并使用一个小的#Define解决方法.这是我的" tr
8 2023-11-20
编程技术问答社区