我正在尝试使用 C ++ STD Technallight1 扩展程序来生成正常发行后生成数字,但是此代码(改编自本文): mt19937 eng; eng.seed(SEED); normal_distribution dist; // XXX if I use the one below it exits the for loop // uniform_int dist(1, 52); for (unsigned int i = 0; i
以下是关于 tr1 的编程技术问答
是否有一种规范的方法来处理试图维护TR1和非TR1工具链之间的可移植代码时出现的命名空间问题? 我有一个#include 的VC ++ 2010项目.我还有一个LLVM 3.0编译器,可以处理此罚款.这使我可以使用诸如: 之类的模板 std::enable_if std::is_enum 但是,我还需要在Xcode 4.5 clang编译器上构建和维护此代码: $ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang --version Apple clang version 4.1 (tags/Apple/clang-421.11.66) (based on LLVM 3.1svn) Target: x86_64-apple-darwin11.4.2 Thread mod
我使用的是mingw 4.5.2,我想使用tr1名称空间中的unordered_map,而不是通过传递-STD = C ++ 0x启用的STD名称空间的unordered_map.我敢肯定,这可以做到,因为有两个unordered_map文件,一个在tr1子目录中. 澄清: 我还使用MSVC10编译此代码,并且它支持两个名称空间中的unordered_map,但仅在一个位置.因此,我想将其与两个编译器进行编译,并尽可能最小化. 解决方案 包括并使用std::tr1::unordered_map. 编辑: 我还使用MSVC10编译此代码,并且在两个名称空间中支持它,但仅在一个位置中.因此,我想将其与两个编译器进行编译,并尽可能最小化. 要与两个编译器进行编译,您可以使用以下内容: #if defined(_MSC_VER) && _MSC_VER >= 1600 # include
您可以分配一个std ::向量,该向量通过定义自己的分配器来分配对齐的堆内存. 您可以使用dectSpec Align在堆栈上分配C风格数组. 但是,您可以声明一个tr1 ::数组,以确保索引零的元素会对齐? 解决方案 tr1::array(以及std::array和boost::array)是POD,因此内容所占据的内存与array的内存一致.因此,您需要分配array,并使用放置new. 进行构造 typedef std::tr1::array AryT; void *array_storage = aligned_allocation( sizeof( AryT ) ); AryT *ary = new( array_storage ) AryT( initial_value );
我有C ++ 03代码,看起来像这样: #include ... std::tr1::unordered_map mystuff; ... 我开始怀疑,如果/当我将代码转换为c ++ 11时,我会遭受痛苦,而我猜则没有std::tr1::unordered_map,但std::unordered_map> std::unordered_map.所以我想到了以下黑客: namespace std { using namespace ::std::tr1; } ... std::unordered_map mystuff; // no tr1 now! ... 是合法的(也许禁止将东西进口到std中)?它会使与C ++ 11代码端口/互操作更容易? 解决方案 您不应该触摸std名称空间:即使现在起作用,也可能会引起严重的头痛(
现在shared_ptr在TR1中,您认为使用std::auto_ptr应该如何?它们都有不同的用例,但是所有auto_ptr的用例也可以用shared_ptr解决.您会放弃auto_ptr还是在您想明确表示只有一个班级拥有任何特定点的所有权的情况下继续使用它? 我的看法是,使用auto_ptr可以通过添加细微差别和代码设计的指示来增加代码的清晰度,但另一方面,在培训新程序员时,它增加了另一个微妙的问题:他们需要了解智能指针及其工作方式的细节.当您到处仅使用一个智能指针时,您只需放置一个规则"将所有指针包装在shared_ptr中"并完成. 您对此有何看法? 解决方案 在下一个标准(C ++ 0x)中对"避免std::auto_ptr>"营提供更多弹药:auto_ptr正在弃用.我认为单独的这是足够好的弹药,以便任何其他论点都可以使用其他东西. 然而,如 konrad rudolph auto_ptr的默认替换可能应为boost::scoped_ptr. sco
Mac 上对TR1或新的C ++ 0x的当前支持是什么 我知道,Xcode提供的海湾合作委员会始终是gcc.gnu.org可获得的几个版本,所以我只是想知道现代支持的状态是什么. . 例如,我需要下载boost以使用shared_ptr,还是可以从std :: tr1获得它? 解决方案 OS X 10.6带有G ++ 4.2.1以及G ++ 4.0的船,但是如果您选择,请直接安装自己的构建. GNU工具很棒.这建立在我的机器上,一个雪豹Mac,具有G ++ 4.2.1: #include int main(int argc, char* argv[]) { std::tr1::shared_ptr p; return 0; }
当我尝试包含之类的内容时,它会失败,并说该文件不存在,而当我尝试包含时,它有效.但是,找到了C ++ 03中也存在的包含文件,并且是C ++ 11(例如具有移动构造函数).另外,通常也发现仅在C ++ 11中而不在TR1中的标题,例如. 就像TR1中新的所有事物都刚刚扔入TR1文件夹中,其他所有内容都包括正常. 为什么会发生这种情况?有没有修改源文件的任何修复? 通过-I/path/to/include/tr1无法正常工作,因为一切都在tr1名称空间中. 我正在使用的编译器是 Apple clang version 3.0 (tags/Apple/clang-211.10.1) (based on LLVM 3.0svn) 解决方案 TR1(技术报告1)不是标准,而仅仅是报告.这是一种让人们知道委员会对该领域感兴趣的官方方式.任何TR1实施都是一个实验版本,旨在获得现场
我了解TR1于2005年完成,必须等到C ++ 11才能进行标准化. 但是我也知道TR2已经完成了吗? 我与C ++ 17的链接没有提及有关TR2的任何内容,但我希望... 解决方案 也许. TR(现在是技术规格)的点是允许独立于标准迭代过程成熟的东西.他们可以发布TS,查看其工作原理,查看该功能的实现和/或使用中是否存在任何问题,如果一切正常,则可以将其"折叠"到完整的标准中. 每个TS都具有自己的优点考虑,以查看是否将其折叠到下一个标准中. 请参阅如果在2017年之前完成的任何一个,则可以将其折叠成标准.他们不太可能会. 一个目标是我们可以及早获得std::experimental功能(如果我们愿意接受我们的脚下的地面移动),同时,将功能曾经添加到std中,较少的遗憾和该点之后的规范更改.也可能有巨大的组织间接费用,可以将主线标准与每个附带项目分离并允许它们独立发展. . 其他解决方案 技术报告或现在的技术规范的目的是获得实施者和用户的
作为 can tr1 :: function whats whallow return值? ,一个人如何解决tr1::function无法吞咽返回值的限制? 这应该在吞咽可可对象的返回值的特定情况下起作用: template struct swallow_return_t { explicit swallow_return_t(FuncT i_Func):m_Func(i_Func){} void operator()(){ m_Func(); } FuncT m_Func; }; template swallow_return_t swallow_return(FuncT f) { return swallow_return_t(f); } 然后使用: int Foo(); std::tr1::function Bar = swallow_
我通过 n1429 p> 算法REGEX_MATCH和REGEX_SERZER都支持正则表达式库中常见的功能:部分匹配.当标志 std::regex_constants::match_partial 设置在传递给该算法的标志中时,如果匹配一个或多个字符,则可以返回真实的结果,然后状态机到达字符的末端序列虽然仍有状态匹配. [...] ,但我找不到FCD中的任何痕迹,也找不到当前GCC-4.7.0的标题.我还寻找了N1429的修订版,但没有发现任何东西.我知道该提案的基础起源于Boost,并将其纳入TR1.但是我不知道match_partial何时消失. 部分匹配功能是否仍在C ++ 11中?也许有其他名称? 解决方案 似乎在 7.34 Match_partial标志的含义 删除match_partial. 根据 LWG同意这是一个有用且可实施的功能,但我们反复尝试了 并且未能给它足够的规格.我们希望可以添加此功能 在未来版本中. 我想C +
boost :: function 为什么有无效的解决方法 返回? C ++允许他们! void返回 由C ++标准允许 在此代码段中: void f(); void g() { return f(); } 这是有效的用法 boost ::功能是因为void返回 不使用.有空白的回报,我们 会试图编译成型的 代码类似: int f(); void g() { return f(); } 本质上,不使用空隙回报 允许boost ::功能吞咽 返回值.这与 允许用户分配和调用 功能和功能对象 不完全匹配的参数. 不幸的是,这在VS2008中不起作用: int Foo(); std::tr1::function Bar = Foo; 这会从以下原因开始产生错误. c:\Program Files\Microsoft Visual Studio 9.0\VC\include\xxcallfun(7) : error C2562: 'st
我在C ++类中使用非常复杂的C函数有问题(重写C函数是不是一个选项). C功能: typedef void (*integrand) (unsigned ndim, const double* x, void* fdata, unsigned fdim, double* fval); // This one: int adapt_integrate(unsigned fdim, integrand f, void* fdata, unsigned dim, const double* xmin, const double* xmax, unsigned maxEval, double reqAbsError, double reqRelError, double* val, double*
不同的编译器似乎对TR1有不同的想法. G ++似乎只接受包括: #include #include ... 虽然Microsofts编译器仅接受: #include #include ... ,据我了解,Microsoft方法是正确的. 有没有办法让G ++接受第二版? 通常,一个人如何以便携式方式处理TR1? 解决方案 在您的计算机上安装Boost. 将以下目录添加到您的搜索路径. /boost/tr1/tr1 请参阅此处现在,当您包含时,您将获得具有std :: tr1 :: shared_ptr的内存的TR1版本,然后包含平台的特定版本以获取所有正常的好东西. 其他解决方案 #ifdef _WIN32 #include #include #els
给定: #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中都是肯定的) no:clang/libc ++( http://libcxx.llvm.org/截至今天,SVN) (如果"否"是正确的答案,我将修复我的真实代码以将完整的类型放入更多标题或使用boost :: function.) 编辑:这是叮当错误消息: In file in
我正在尝试根据是否有TR1库来打字Unordered_map或STD :: MAP.但是我不想指定模板参数.从我到目前为止阅读的内容来看,在官方C ++ 0x标准可用之前,不可能使用Typedef'ing模板.那么有人知道这是一个优雅的解决方法吗? #ifdef _TR1 #include typedef std::tr1::unordered_map MyMap; //error C2976: too few template arguments #else #include typedef std::map MyMap; //error C2976: too few template arguments #endif 解决方案 我看过的方式是将Typedef包裹在模板结构中: template struct myMap { #ifdef _T
boost::shared_ptr boost::shared_ptr boost::shared_ptr ,std::tr1::shared_ptr和即将到来的(在C++0x中)std::shared_ptr? 移植到另一个人的开销会或基本相同吗? 解决方案 根据Boost网站,boost::shared_ptr ... ...符合TR1规范,其唯一驻留在命名空间boost而不是std::tr1中. . 根据wikipedia TR1实现缺少某些指针功能,例如混叠和指针算术,但是C ++ 0x版本会添加这些. 如果您的代码与TR1/Boost版本一起使用,则应与C ++ 0x版本一起使用(但不一定是VICE).
是否有可能以某种方式比较两个std::tr1::function对象?如果我有function对象的集合并要添加和删除事件处理程序怎么办?添加是微不足道的,但是发现要删除的一个似乎是不可能的. 解决方案 基于以下链接中堆栈溢出的信息,这是可能的,但前提是将std ::函数对象包装在其自己的类中. std :: std :: vector of std :: function :: function 通过使用包装器类,您可以测试两个包装的std ::功能指针是否相等,但这并不能告诉您有关std ::函数包装的内容.因此,改变设计可能是一种更好的方法. 编辑:我回来说明了解决一个非常相似的问题的方式. 0)typedefs for contiseseness. using std::placeholders; typedef std::function
我最初认为它们都是一样的,但事实证明这是错误的.那么,谁能简要地解释这三者之间的差异?例如: 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名称空间