2016-11-24 72 views
4

考虑的持续时间下面的代码:的std ::性病::时辰分钟::不同类型

// durations are from std::chrono 
auto a = get_duration_1(); // milliseconds, will vary in future versions 
auto b = get_duration_2(); // seconds, will vary in future versions 
auto c = std::min(a, b); 

它不会编译,因为编译器不能实例化,因为不同的参数类型的std::min正确版本。

当然,现在可以使用std::min<milliseconds>明确指定类型。在此代码的将来版本中,类型会有所不同。在不知道确切持续时间类型的情况下,通用的方法是什么?

+0

如果没有指定,['标准:: min']现有的专业化(http://en.cppreference.com/w/cpp/algorithm/分钟)[[std :: chrono :: duration]](http://en.cppreference.com/w/cpp/chrono/duration)(并没有),那么没有没有通用(和“好“) 办法。除了自己做这样一个专业。如果你在多个地方需要它,那么这样的专业化可能是一个好主意。 –

+2

[std :: min](http://en.cppreference.com/w/cpp/algorithm/min)没有接受不同参数类型的版本。要么抛出其中一个参数,要么两者兼有。 –

+0

我更改了问题,以便明确显示对通用代码的需求。 –

回答

8

鉴于两会期间,D1 d1D2 d2 ...

你既可以持续时间转换为他们的普通型,,然后找出最小的值。

或者只需拨打std::min<std::common_type_t<D1, D2>>(d1, d2),并根据需要将它们转换为该类型。

这是有效的,因为std::common_type专门为duration类型做正确的事情,请参阅C++标准中的[time.traits.specializations]。

+1

可以用函数模板包装,不是吗?有用的工具,不仅仅是'std :: chrono' – StoryTeller

+0

看起来像一个解决方案。在这个具有'auto'变量的特定情况下,我应该做'std :: common_type '? –

+0

当然可以。在你的情况下,'D1'是'decltype(a)','D2'是'decltype(b)',所以相应地替换。但要小心:这应该是'common_type_t'而不是'common_type' –

5

您可以使用以下功能:

#include <chrono> 

template <typename T1, typename T2> 
auto generic_min(const T1& duration1, const T2& duration2) 
{ 
    using CommonType = typename std::common_type<T1,T2>::type; 
    const auto d1 = std::chrono::duration_cast<CommonType>(duration1); 
    const auto d2 = std::chrono::duration_cast<CommonType>(duration2); 
    return std::min(d1,d2); 
} 
+0

不幸的是,我只能标记一个答案是正确的。谢谢你的确切代码! –

相关问题