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

gcb*_*son 3 c++ templates

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

template<enum_t e1, enum_t e2>
struct max_of { static const enum_t value = SOMEHOW_MAX(e1, e2); };
Run Code Online (Sandbox Code Playgroud)

其中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; };
Run Code Online (Sandbox Code Playgroud)

这确实有效,但即使对于少数enum_t价值观也显然变得相当冗长.有没有办法让模板系统以编程方式获取最大值?

Ser*_*eyA 6

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

template<enum_t A, enum_t B> 
struct max_of {
    enum { value = A > B ? A : B};
};
Run Code Online (Sandbox Code Playgroud)