- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在编写一个类似整数的类,它代表一个位于某个范围内的值。例如,bounded::integer<0, 10>
的值位于 [0, 10] 范围内的某处。对于这个类,我定义了 radix
成为2
.
digits
的值应该是多少?为 bounded::integer<-100, 5>
?
那bounded::integer<16, 19>
呢? ?
最佳答案
在进一步阅读标准并思考这个问题后,我相信我有最好的答案,但我不确定。
首先是 digits
的定义,取自最新的 C++14 标准草案,N3797,§ 18.3.2.4:
static constexpr int digits;
8 Number of
radix
digits that can be represented without change.9 For integer types, the number of non-sign bits in the representation.
10 For floating point types, the number of
radix
digits in the mantissa
bounded::integer<-100, 5>
的情况与 bounded::integer<0, 5>
的情况相同,后者的值为 2
。
对于 bounded::integer<16, 19>
的情况, digits
应该定义为 0
。这样的类甚至不能表示一位数字(因为 0
和 1
不在范围内),并且根据 18.3.2.7.1:
All members shall be provided for all specializations. However, many values are only required to be meaningful under certain conditions (for example,
epsilon()
is only meaningful ifis_integer
isfalse
). Any value that is not "meaningful" shall be set to 0 or false.
我相信任何没有 0
作为可能值的类似整数的类都无法有意义地计算 digits
和 digits10
。
另一个可能的答案是使用数字的信息论定义。但是,这与内置整数的值不一致。该描述明确省略了符号位,但这些仍将被视为单个信息位,因此我认为这排除了这种解释。似乎排除符号位也意味着我必须取范围的负端和正端中较小的一个作为第一个数字,这就是为什么我认为第一个问题等同于 bounded::integer<0, 5>
。这是因为您只能保证 2 位可以存储而不会丢失数据。只要您的数字为负数,您就可以存储多达 6 位,但通常只能存储 2 位。
bounded::integer<16, 19>
更棘手,但我相信“无意义”的解释比将值移过来并给出与 bounded::integer<0, 3>
相同的答案更有意义,这将是 2
。
我认为这种解释符合标准,与其他整数类型一致,并且最不可能混淆此类的用户。
为了回答 digits
的用例问题,一位评论者提到了基数排序。 base-2 基数排序可能希望使用 digits
中的值对数字进行排序。如果将 digits
设置为 0
会很好,因为这表示尝试使用这种基数排序的错误条件,但我们能否在与内置类型保持一致的同时做得更好?
对于无符号整数,根据 digits
的值进行基数排序就可以正常工作。 uint8_t
有 digits == 8
。但是,对于有符号整数,这不起作用: std::numeric_limits<int8_t>::digits == 7
。您还需要对该符号位进行排序,但 digits
没有提供足够的信息来执行此操作。
关于c++ - std::numeric_limits<T>::digits 应该代表什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19609186/
我正在开发一个小型图书馆,我需要做的一件事是让访问者访问一些数据并返回结果。 在一些较旧的 C++ 代码中,访问者需要声明一个 typedef return_type .例如,boost::stati
我正在尝试使用std:map类型的键和值制作std::any Visual Studio 2017 std::map m("lastname", "Ivanov"); std::cout (m["la
我已经在 C++ 的 map 中声明了一个集合为 std::map> .如何循环访问或打印设定值? 最佳答案 如果你知道如何迭代 std::map或 std::set单独地,您应该可以毫无问题地组合迭
如何循环? 我已经试过了: //----- code std::vector >::iterator it; for ( it = users.begin(); it != users.end();
我有两个用例。 A.我想同步访问两个线程的队列。 B.我想同步两个线程对队列的访问并使用条件变量,因为其中一个线程将等待另一个线程将内容存储到队列中。 对于用例 A,我看到了使用 std::lock_
我正在查看这两种类型特征的文档,但不确定有什么区别。我不是语言律师,但据我所知,它们都适用于“memcpy-able”类型。 它们可以互换使用吗? 最佳答案 不,这些术语不能互换使用。这两个术语都表示
我有以下测试代码,其中有一个参数 fS,它是 ofstream 的容器: #include #include #include #include int
这是这个问题的延续 c++ function ptr in unorderer_map, compile time error 我试图使用 std::function 而不是函数指针,并且只有当函数是
std::unordered_map str_bool_map = { {"a", true}, {"b", false}, {"c", true} }; 我们可以在此映射上使
我有以下对象 std::vector> vectorList; 然后我添加到这个使用 std::vector vec_tmp; vec_tmp.push_back(strDRG); vec_tmp.p
为什么 std::initializer_list不支持std::get<> , std::tuple_size和 std::tuple_element ?在constexpr中用得很多现在的表达式,
我有一个像这样定义的变量 auto drum = std::make_tuple ( std::make_tuple ( 0.3f , Ex
假设我有一个私有(private)std::map在我的类(class)里std::map 。我怎样才能将其转换为std::map返回给用户?我想要下面的原型(prototype) const std
假设我有一个私有(private)std::map在我的类(class)里std::map 。我怎样才能将其转换为std::map返回给用户?我想要下面的原型(prototype) const std
问题 我正在尝试将 lambda 闭包传递给 std::thread,它使用任意封闭参数调用任意封闭函数。 template std::thread timed_thread(Function&& f
我想创建一个模板类,可以容纳容器和容器的任意组合。例如,std::vector或 std::map ,例如。 我尝试了很多组合,但我必须承认模板的复杂性让我不知所措。我编译的关闭是这样的: templ
我有一个 std::vector>我将其分配给相同类型的第二个 vector 。 我收到这个编译器错误: /opt/gcc-8.2.0/include/c++/8.2.0/bits/stl_algob
有时候,我们有一个工厂可以生成一个 std::unique_ptr vector ,后来我们想在类/线程/你命名的之间共享这些指针。因此,最好改用 std::shared_ptr 。当然有一种方法可以
这个问题在这里已经有了答案: Sorting a vector of custom objects (14 个答案) 关闭 6 年前。 我创建了一个 vector vector ,我想根据我定义的参
我有三个类(class)成员: public: std::vector > getObjects(); std::vector > getObjects() const; privat
我是一名优秀的程序员,十分优秀!