std :: max,但用于模板参数
A std::max, but for template parameters
我发现自己需要一个模板类,该类别在编译时找到了两个常数的最大值;这样的东西:
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
值,显然变得冗长。是否有某种方法可以使模板系统在编程中最大化?
在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;
}
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 使用在用于SFINAE的void_t中具有参数的方法
- 用于检查值是否为其任何参数的帮助程序函数
- 为什么可变参数函数不适用于模板
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 一个模板方法,用于同时接受常量和非常量参数
- Constexpr 可变参数模板,用于对无符号整数进行重新排序
- 使用一个参数的模板函数时出错(适用于 2)
- 为什么模板参数推导不适用于仅指定前两个参数的可变参数模板类?
- 隐式生成的函数重载用于右值参数?
- 为什么带有类型参数的运算符 () 可以应用于 result_of 上下文中的类型?
- 将非 const 对象用于 const 参数
- 我可以将模板中的类型参数用于非类型参数吗?
- opencl openGL互操作内核参数用于读取 写入
- 分配参数用于测试目的
- 将命令行参数用于输入参数
- 如何使用类的属性作为模板参数/用于专用化
- 为什么我不能将此参数用于 std::sort() 的比较?
- 模板类参数用于模板类函数语法
- 为什么 GCC 不允许我将模板参数用于另一个模板的参数?