std :: max,但用于模板参数

A std::max, but for template parameters

本文关键字:参数 用于 max std      更新时间:2023-10-16

我发现自己需要一个模板类,该类别在编译时找到了两个常数的最大值;这样的东西:

template<enum_t e1, enum_t e2>
struct max_of { static const enum_t value = SOMEHOW_MAX(e1, e2); };

其中enum_t是枚举类型,而max_of<x, y>::value应等于xy的最大值。因此,问题是:用SOMEHOW_MAX使用什么?我不受使用C 14功能的约束,因此它不能仅仅是std::max,因为这无法在编译时比较模板参数值。如果enum_t的基数相当小,则实现max_of的一种可能方法是通过模板专业化,例如:

template<>
struct max_of<E_FIRST, E_SECOND> { static const enum_t value = E_SECOND; };

确实有效,但对于少数 enum_t值,显然变得冗长。是否有某种方法可以使模板系统在编程中最大化?

在C 14中,您应该只使用std::max。但是,如果C 14是禁止的,则遵循简单的代码应有所帮助:

template<enum_t A, enum_t B> 
struct max_of {
    enum { value = A > B ? A : B};
};

您有两个解决方案。您可以使用简单的比较,并使用三元操作员选择最大的值,也可以使用std::max,它适用于C 14及以上。

std::max解决方案

template<enum_t e1, enum_t e2>
struct max_of {
    static constexpr auto value = std::max(e1, e2);
};

手动解决方案:

template<enum_t e1, enum_t e2>
struct max_of {
    static constexpr auto value = e1 > e2 ? e1 : e2;
};

您可以或者可以实现自己的最大函数,以完成C 11中的constexpr缺少一个:

template<typename T> 
constexpr const T& max(const T& a, const T& b) {
    return (a < b) ? b : a;
}