gpt4 book ai didi

C++:为什么 numeric_limits 对它不知道的类型起作用?

转载 作者:IT老高 更新时间:2023-10-28 22:21:21 27 4
gpt4 key购买 nike

我创建了自己的类型,没有任何比较器,也没有专门化 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com