- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
鉴于 std::chrono::duration
可以表示两个时间之间的带符号差值,因此需要此类持续时间的绝对值似乎是一种非常常见的情况。例如,以下代码按预期输出 diff: -5
:
using namespace std;
using namespace std::chrono;
auto now = system_clock::now();
auto then = now - seconds(5);
auto diff = then - now;
cout << "diff: " << duration_cast<seconds>(diff).count() << endl;
如果能做这样的事情就好了:
auto diff = abs(then - now);
但是,我在标准中看不到 std::abs
对 chrono
模板的任何特化,也看不到 中任何适当的成员函数>std::chrono::duration
.
我应该如何将 std::chrono::duration
转换成它的绝对值?
最佳答案
我会这样做:
template <class Rep, class Period>
std::chrono::duration<Rep, Period>
abs(std::chrono::duration<Rep, Period> d)
{
Rep x = d.count();
return std::chrono::duration<Rep, Period>(x >= 0 ? x : -x);
}
查看我的 <chrono>
Utilities 列表,了解我希望成为标准的其他 <chrono>
实用程序。请随意使用它们,将它们推荐给您的标准机构代表,或者您自己提出。
更新
当我写以上内容时,我不在游戏中。我不会删除它,因为它为我自己和其他人提供了一个很好的教训,告诉他们如何不编写 chrono
实用程序。
我不喜欢它的地方:
它通过直接操纵 Rep
不必要地降低类型安全。
它假定文字 0 可以隐式转换为 Rep
,或者至少可以与 constexpr
进行比较。
没有理由不是 Rep
。
我对 unsigned t1
的行为不满意。如果有人说:
自动 d = abs(t1 - t0);
而t0
和t1 < t0
是基于unsigned duration的,那么这很可能是代码中的逻辑错误。如果是 abs
,那么您可能会得到一个不正确的、非常长的持续时间。如果那是您真正想要的,那么您不应该使用 abs
,而是编写更简单的代码:
auto d = t1 - t0;
为了解决这些问题,我将持续时间的 duration
重写为:
template <class Rep, class Period,
class = typename std::enable_if
<
std::chrono::duration<Rep, Period>::min() <
std::chrono::duration<Rep, Period>::zero()
>::type
>
constexpr
inline
std::chrono::duration<Rep, Period>
abs(std::chrono::duration<Rep, Period> d)
{
return d >= d.zero() ? d : -d;
}
-
有一元 duration
,随便用吧。
zero
具有可定制的 0
特性,因此您不必假设与 Rep
中的 constexpr
密切合作。就用它吧。
使用的所有操作都是 abs
,用 constexpr
标记 min
。
静态函数 zero
和 constexpr
是 Rep
。使用这些来确定 !std::is_unsigned
是否已签名比使用 Rep
等特征更通用。 IE。 BigNum
可能是 timespec
或 C11 min() < zero()
(用重载算术运算符增强)。所以问题“已签名”用 abs
回答。现在这个版本的 duration<unsigned, milli>
将不接受 ojit_code(例如)。
关于c++ - std::chrono::duration 对象的绝对值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21321445/
我正在尝试解决一个问题: 编写一个程序计算非负整数之间的差值。 输入: 输入的每一行都由一对整数组成。每个整数都在 0 到 10 之间提高到 15(含)。输入在文件末尾终止。 输出: 对于输入中的每一
我有一个这样的数据框: Current Dataframe: ID Price Price_List 0 Prodt1 1500 [-5.2, -4.6, -3.3,
很难解释...让我试试: 我构建了一个脚本来比较两个用户的兴趣(爱好) 假设用户 A 有 44 种爱好,并且与用户 B(有 19 种爱好)有 13 种共同爱好所以在伪代码中(其中 % 是我的公式):
我在 LINQ 查询中使用 EntityFunctions 类: var a = dbContext.Where(x=>EntityFunctions.DiffMinutes(dateA,dateB)
我正在做一项作业,我应该返回 3 个值中最小的一个(绝对值,如程序所述)。当只需要返回 2 个值时,它工作得很好,但是当我添加第三个值时,它开始在方法内的 Math.min 处显示“找不到符号”。 :
我写了一个名为 absD 的函数,我想返回它的参数的绝对值..我在 cygwin 中使用 GCC 内联汇编.. 我不明白为什么它不起作用。我正在加载到内存中。然后进入 st(0)我在哪里使用 fabs
以原始形式。 svm 中很少有 alpha 值为正,相应的 x 将是支持向量,如图所示 http://en.wikipedia.org/wiki/Support_vector_machine . 如果
我对 xcode 中 ABS(A) 和 abs(int) 这两者的区别感到困惑。似乎也无法在网上找到任何解释。我应该使用哪个?我实际上正在研究加速度计。使用 ABS(A) 和 abs(int) 给了我
我一直在努力尝试理解 pandas 时间戳和时间增量。我喜欢你使用它们的方式,但在尝试减法时我发现这有点奇怪: now = pd.Timestamp('now') then = now - pd.to
假设我有一个对称矩阵 M,它不是正(半)定的,我想计算它的 k 顶(绝对值)特征值(和相应的特征向量)。现在,可以使用截断的 SVD 来做到这一点,它将返回所述特征值的绝对值,然后必须检查符号并找到相
问题很简单。我需要一行命令,例如, Math.round((-Math.random() * 2)) , 输出 只是显示 1 和 -1 .我试图弄清楚,但这似乎不是一件容易的事!我可以使用 IF 命令
我有一个看起来像这样的表: Country | Item | Col1 | Col2 | Col3 | Col4 4 | 4 | .152 | .01 | .65 | 1
我是 Laravel 框架的新手,我正在寻找如何编写查询以获得绝对值(简而言之,忽略 + 和 - 符号,只显示数据库中的数字。我知道我们可以使用 Abs 来获得它。但我不知道该怎么做。看看我的代码:
Working jsfiddle 对 jQuery/javacript 来说还是个新手,但我有 2 个函数,它们在检查时对隐藏值求和,并且我需要生成它们差异的绝对值: $(document).read
我有这个数据框和代码。 from pandas import DataFrame import pandas as pd import numpy as np df = pd.DataFrame({'
我知道 - 过早的优化。 但是我有代码可以查明某个位置是否发生了变化,而不是缓存的位置。 当前代码是: if(abs(newpos-oldpos) > 1){ ..... } 使用下面的是不是
This question它的答案描述了为什么 i32 上的 abs() 返回 i32 而不是 u32。它说“似乎公认的解决方法是使用 as u32 进行转换”。但是,如果参数是 std::i32::
我是一名优秀的程序员,十分优秀!