2

我需要对我的 C++11 可变参数版本的实现进行反思std::minstd::max. 这是我的两个替代方案std::min,其中只需替换std::max为类似地实现:std::minstd::max

/*! Multi-Type Minimum of \p a. */
template <LessThanComparable T> const T & multi_type_min (const T & a) { return a; } // template termination
/*! Multi-Type Minimum of \p a and \p args. */
template <class T, class ... R >
//requires SameType <T , Args >...
T multi_type_min(const T & a, const R &... b)
{
    return std::min(a, multi_type_min(b...));
}

/*! Minimum of \p a. */
template <LessThanComparable T> const T & common_type_min(const T & a) { return a; } // template termination
/*! Minimum of \p a and \p args. */
template <class T, class ... R, class C = typename boost::common_type<T, R...>::type >
C common_type_min(const T & a, const R &... b)
{
    return std::min(static_cast<C>(a), static_cast<C>(common_type_min(b...)));
}

关键问题是我们是否需要common_type_min?请注意,这允许使用一个参数调用 min()。这会导致混乱或问题吗?

4

1 回答 1

2

你不能把它写成递归,直到你停在两个参数处?

这是一个(未经测试的)片段:

/*! Multi-Type Minimum of \p a and \p args. */
template <class T, class U >
//requires SameType <T , U >...
T multi_type_min(const T & a, const U & b)
{
    return std::min(a, b);
}

/*! Multi-Type Minimum of \p a and \p args. */
template <class T, class U, class ... R >
//requires SameType <T , U, Args >...
T multi_type_min(const T & a, const U & b, const R &... c)
{
    return std::min(a, multi_type_min(b, c...));
}

我猜common_type_min当有多种常见类型时,变体是必要的。考虑比较shortlong值。由于类型提升,short将转换为long进行比较。但是,某些应用程序约束或不变量可能会让您知道这两个值都可以用short. 在这种情况下,您可能希望拥有common_type_min<short>(a,b).

于 2011-09-24T15:21:31.153 回答