- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我创建了自己的类型,没有任何比较器,也没有专门化 std::numeric_limits
.尽管如此,出于某种原因,std::numeric_limits<MyType>
编译得很好。为什么 c++ 标准委员会定义 numeric_limits
模板,使其适用于所有类型,包括非数字类型?
示例代码如下:
#include <iostream>
#include <limits>
using namespace std;
// This is an int wrapper that defaults to 666 instead of 0
class A {
public:
int x;
public:
A() : x(666) {}
};
int main() {
A a = std::numeric_limits<A>::max();
A b = std::numeric_limits<A>::max();
std::cout << a.x << "\n" << b.x;
// your code goes here
return 0;
}
最佳答案
类模板std::numeric_limits
被添加以替换 <limits.h>
中的宏在模板元编程成为一件事之前:它出现在标准前的公开发行草案中(~1995 年)。模板元编程是由 Erwin Unruh 在斯德哥尔摩 session 期间(1996 年 7 月)发明的。在这一点上,没有人想到是否可以检测到定义了类模板。相反,std::numeric_limits<T>::is_specialized
将指示(在编译时)类模板对于类型 T
是否是专用的和有意义的.各种成员被定义为使用一个合理的默认值,这将使它有可能编译代码,尽管泛型将被实现,这样它就不会使用任何非特化类型的值。
与 std::numeric_limits
像在 C++ 标准中那样指定它不会在没有充分理由的情况下更改:任何更改都可能会破坏某人的代码 - 即使使用现在发现的技术可以更好地完成此代码(其中一些是 C++ 真正无法使用的) 98)。委员会现在不会设计这样的特征:<type_traits>
中的类型特征是独立的特征 - 尽管通常仍为所有可行的类型定义合适的默认值。但是,也没有理由更改std::numeric_limits
以一种破坏性的方式,因为当前的定义确实有效。
请注意,并非 std::numeric_limits<T>
的所有成员适用于所有类型 T
.例如使用 std::numeric_limits<T>::max()
如果 T
将无法编译的默认构造函数不可访问、不可用或 delete
d。因此,您最好不要保护对任何成员的访问,以了解类模板是否是专用的(使用 C++17):
template <typename T>
void f() {
if constexpr (std::numeric_limits<T>::is_specialized) {
// use of std::numeric_limits<T>::max(), min(), etc.
}
else {
// implement the rquired functionality differently
}
}
关于C++:为什么 numeric_limits 对它不知道的类型起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47520847/
我正在阅读 Setting an int to Infinity in C++ .我知道当一个人需要真正的无限时,应该使用 numeric_limits::infinity() ;我猜它背后的基本原理
我有一个错误 limits:30:29: error: 'numeric_limits' is not a template 在文件中,它为特定类重载了 std::numeric_limits:
如果你错误地做了类似的事情: #include int arr[3]; auto x = std::numeric_limits::max(); 您将从 STL 实现中的文件中获得无用的错误消息。
为什么这不起作用? enum : long {MaxValue = std::numeric_limits::max()}; 我收到错误:错误 1 错误 C2057:预期的常量表达式 它有什么不固
我在调试一些涉及确定加法运算是否会下溢 double 的代码时遇到了一些奇怪的行为,至少在我看来是这样。这是一个示例程序,展示了我的发现。 #include #include using std:
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Why is std::numeric_limits::max() a function? 为什么 nume
我有一个带有两个参数的函数,一个其元素正在被测试的 vector ,以及一个我们输入为真或假的 bool 变量。如果我们输入 true 那么它应该隔离所有数字总和为偶数的元素并将其放置到一个新 vec
numeric_limits::min(); numeric_limits::lowest(); 这两个函数返回的值有什么不同? 最佳答案 C++11 标准第 18.3.2.4 段规定: static
我有一个包含范围参数的模板统计类。 template class limitStats { public: limitStats(T mx, T min) : max(mx),
我在为 enum 中的元素分配最大值时遇到问题。第一: protected: enum {DEFAULT_PADDING=std::numeric_limits::max()}; 结果: ./
基本上,我想这样做: // error: function call is not allowed in a constant expression: static_assert( std::nu
我正在使用想要使用 STL 的数据结构 limits确定我给它的结构的最小值、最大值和无穷大(我认为只有这些)值。我正在使用 Visual C++ 2010,如果有这方面的具体实现细节的话。 这是我的
有什么方法可以使用 std::numeric_limits::is_integer和 std::numeric_limits::is_specialized改变模板行为? 例如我可以这样做吗: tem
C++11 标准是否指定 numeric_limits::min和 max必须是可在模板中使用的常量表达式或 static_assert ? 更一般地说,如何根据标准找到常量表达式的函数列表? 最佳答
我有一个名为 Atomic 的类,它基本上是一个 _Atomic_word加上调用 gcc 原子内置函数的方法。 class Atomic{ mutable volatile _Atomic_
我创建了自己的类型,没有任何比较器,也没有专门化 std::numeric_limits .尽管如此,出于某种原因,std::numeric_limits编译得很好。为什么 c++ 标准委员会定义 n
我想在一个类中定义一个常量,它的值是最大可能的 int。像这样的: class A { ... static const int ERROR_VALUE = std::numeric_
我正在尝试从源代码编译应用程序,FlyWithLua ,其中包括 sol2 库。 我正在按照说明进行操作,但是当我运行 cmake --build ./build 时,出现以下错误: In file
当我编译这段 C++ 代码时,我没想到会看到这样的输出 #include #include #include int main() { const long double ldMinFl
我正在尝试编写一个分别处理数字和非数字数据的流类。有人可以向我解释为什么这段代码无法编译吗? #include #include #include #include class Stream
我是一名优秀的程序员,十分优秀!