一个std :: max,但是对于模板参数

时间:2016-06-15 19:48:16

标签: c++ templates

我发现自己需要一个模板类,它在编译时找到最多两个常量值;像这样的东西:

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值,也显然变得相当冗长。有没有办法让模板系统以编程方式获取最大值?

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

你有两个解决方案。您可以使用简单的比较并使用三元运算符来选择最大值,或者您可以使用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;
};

您也可以实现自己的max函数来完成c ++ 11中constexpr的缺省:

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