我发现自己需要一个模板类,它在编译时找到最多两个常量值;像这样的东西:
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
应该等于x
和y
的最大值。所以问题是:用什么代替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
值,也显然变得相当冗长。有没有办法让模板系统以编程方式获取最大值?
答案 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;
}