问题标签 [c++03]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
896 浏览

c++ - C ++ 03中最接近浮点值的整数

对于某些整数类型,即使浮点值远远超出整数的可表示范围,我如何才能找到最接近浮点类型的某个值的值。

或者更准确地说:

F为浮点类型(可能是floatdoublelong double)。设为I整数类型。

假设两者FI都有有效的专业化std::numeric_limits<>

给定一个可表示的值F,并且只使用 C++03,我怎样才能找到最接近的可表示值I

我追求的是一种纯粹、高效和线程安全的解决方案,除了 C++03 所保证的之外,它对平台没有任何假设。

如果不存在这样的解决方案,是否可以使用 C99/C++11 的新特性找到一个解决方案?

由于报告域错误的方式不平凡,使用lround()C99 似乎存在问题。能否以可移植和线程安全的方式捕获这些域错误?

注意:我知道 Boost 可能通过它的boost::numerics::converter<>模板提供了一个解决方案,但是由于它的高度复杂性和冗长,我无法从中提取要领,因此我无法检查他们的解决方案是否使超出 C++03 的假设。

以下天真的方法失败了,因为I(f)当 的整数部分f不是 的可表示值时,C++03 未定义 的结果I

然后考虑以下方法:

F(std::numeric_limits<I>::min())这也失败了,因为和的组成部分F(std::numeric_limits<I>::max())可能仍然无法在 中表示I

最后考虑这第三种方法,它也失败了:

这个时间I(f)总是会有一个明确定义的结果,但是,因为F(std::numeric_limits<I>::max())可能比 小得多std::numeric_limits<I>::max(),所以我们可能会返回std::numeric_limits<I>::max()一个浮点值,它是低于 的多个整数值std::numeric_limits<I>::max()

请注意,之所以会出现所有麻烦,是因为未定义转换是F(i)向上舍入还是向下舍入到最接近的可表示浮点值。

以下是 C++03(4.9 浮点整数转换)的相关部分:

整数类型或枚举类型的右值可以转换为浮点类型的右值。如果可能,结果是准确的。否则,它是下一个较低或较高可表示值的实现定义选择。

0 投票
4 回答
1935 浏览

c++ - 非实例化模板成员的编译时错误而不是链接时错误

我有一个模板类ItemContainer,它实际上是整个系列容器的外观,具有不同的功能,如排序、索引、分组等。

cpp.使用 pimpl idiom 和显式实例化将实现细节隐藏在文件中。模板仅使用定义容器实际行为的众所周知的有限实现类集进行实例化。

主模板实现了所有容器支持的常用功能 - IsEmpty(),GetCount()Clear()

每个特定容器都专门化了一些仅由它支持的功能,例如Sort()排序容器、operator[Key&]键索引容器等。

这种设计的原因是该类替代了一些史前人在 90 世纪初编写的几个遗留的手工自行车容器。想法是用现代 STL&Boost 容器替换旧的腐烂实现,尽可能保持旧界面不变。

问题

当用户试图从某些专业中调用不支持的功能时,这种设计会导致不愉快的情况。它编译正常,但在链接阶段产生错误(符号未定义)。不是非常用户友好的行为。

例子:

当然,可以通过使用继承而不是专门化来完全避免这种情况,但我不喜欢生成很多具有 1-3 个函数的类。想保留原创设计。

是否有可能将其变成编译阶段错误而不是链接阶段一?我有一种感觉可以以某种方式使用静态断言。

此代码的目标编译器是 VS2008,因此实际的解决方案必须与 C++03 兼容,并且可以使用 MS 特定的功能。但也欢迎可移植的 C++11 解决方案。

源代码:

0 投票
2 回答
3266 浏览

c++ - 带有 C++11 源代码的 C++03 库

如果我有用 C++03 编写的库并将其编译为静态库,那么我可以在 C++11 中使用它吗?也可以反过来( C++11 静态库和 C++03 )。

更新: 我使用的编译器是 clang 或 LLVM

0 投票
3 回答
804 浏览

c++ - Differences between certain standards of C and C++

Where can i see all differences between C++11 and C99?

I think that C++98 and C++03 based on C89 / C90. Is there any differences between them? And what about C++11 and C99? Some features from C99 were added to C++11, but others not (like compound literals, VLAs, etc). Can i see complete list of this changes or not?

0 投票
2 回答
467 浏览

c++ - 我应该将哪个 Boost 版本与支持 C++03 的编译器一起使用?

我的编译器支持 C++03。因此,我应该使用哪个版本的 boost?如果我使用的是早期版本的 C++,我将如何建立 boost 版本?

0 投票
5 回答
249 浏览

c++ - 当模板参数为零时防止模板实例化

我有一个模板类

当 Size 参数为零时,我想阻止此模板的实例化。即为以下内容生成编译器警告。

但所有其他变体都可以。

我正在考虑使用 boost::enable_if_c 但我不明白如何让它工作。

--Update-- 不幸的是,我不能使用任何 c++11 功能

0 投票
1 回答
372 浏览

visual-c++-2008 - C++03下引用折叠

我需要从绑定的成员函数创建一个谓词,所以我将它包装在一个boost::function<bool(SomeObject const &)>. 这似乎很好,一切都很好,但我也需要在一种情况下否定它。然而

无法在 MSVC++ 9.0 (Visual Studio 2008) 下编译,抱怨对引用的引用无效:

问题是boost::function定义argument_typeasSomeObject const &和内部std::unary_negate<_Fn1>实例化的 bystd::not1尝试使用const typename _Fn1::argument_type&并且编译器拒绝它,因为T::argument_type它已经是一个引用。我确信它应该在 C++11 下编译,但这是旧的编译器,只有 C++03。所以我想知道是谁的错:

  • 编译器的,因为它应该折叠引用(显然不是)
  • 标准库的,因为它应该准备好处理获取引用的函子(显然不是,因为规范定义unary_negateconst typename Predicate::argument_type& x参数),
  • boost's,因为argument_type即使实际参数是 or 也不应该被引用
  • 我的,因为boost::function不应该与参考参数一起使用?
0 投票
5 回答
2624 浏览

c++ - 随机数生成器:它应该用作单例吗?

我在几个地方使用随机数,并且通常在需要时构建一个随机数生成器。目前我使用 Marsaglia Xorshift 算法用当前系统时间播种它。现在我对这个策略有些怀疑:如果我使用多个生成器,那么生成器之间的数字的独立性(随机性)取决于种子(相同的种子相同的数字)。因为我使用时间(ns)作为种子,并且因为这个时间改变了这个工作,但我想知道是否只使用一个单一的生成器会不会更好,例如让它作为一个单例可用。这会增加随机数的质量吗?

编辑:不幸的是,c++11 还不是一个选项

编辑:更具体地说:我并不是说单例可以提高随机数质量,而是只使用一个生成器并播种的事实。否则,我必须确保不同生成器的种子彼此独立(随机)。极端的例子:我用完全相同的数字播种了两个生成器->它们之间没有随机性

0 投票
5 回答
3989 浏览

c++ - 用调试版本覆盖 new 而不会损坏放置 new

Microsoft 运行时库提供调试版本的分配函数。对于 C++,这是带有签名的 operator new 的调试变体:

并且宏定义为

现在要检测所有分配,通常定义

然而这个定义打破了任何使用placement new的地方,因为这两组参数最终是语法错误。现在我可以轻松处理我们代码中的少数用途,但标准库和 boost 使用新的布局。因此,全局定义它意味着在定义之前包含很多东西,这会减慢编译速度。

那么是否有任何方法可以在我们的代码中检测分配而无需仅仅因为它们包含新的位置而无需将上面的最后一个定义放在所有文件中或手动编写 DEBUG_NEW 吗?

0 投票
1 回答
2047 浏览

c++ - 在 MSVC++ 中覆盖内存分配器

虽然 Microsoft 标准运行时提供了分配函数的调试版本,但它并没有真正起作用,因为您不应该在 C++ 代码中使用裸 new,因此检测指向标准库,或者因为无论如何都无法检测标准库而无处可去。

现在我有了可以产生(和记录)分配回溯的代码,我也使用了 DUMA。然而,当我们使用流时,替换分配函数的尝试失败了,因为streambuf调用了一些调试变体,并且在 new 和 delete 之间这样做不一致。

那么有没有人在微软标准运行时通过覆盖函数而不是丑陋的预处理器技巧来替换分配器的经验?我怀疑它涉及避免调试分配器,但出于明显的原因我想保留_DEBUG定义(更多的调试代码取决于它)。

注意:我们目前使用 Visual C++ 9.0 (Visual Studio 2008)。

编辑:避免调试分配器不太可能是一个选项,因为 C++ 标准库需要在编译到库的函数和实例化以及用户代码中生成的实例化之间具有一致的 new 和 delete 定义,因为分配可能由一个人完成并由对方释放。顺便说一句,这意味着在包含强制的标题中定义静态内联变体不太可能削减它。

Edit2:动态链接是不可能的,因为 Windows 绑定来自特定 DLL 的符号,因此无法在链接时覆盖它们。但是我们不需要动态链接,也不要使用它,因为主要目标是 WinCE,静态链接是默认的。