代码实现
#include <type_traits>
template <typename T, std::size_t N,
typename = std::enable_if_t<std::is_arithmetic_v<T>>>
struct MaxElementCalculator {
static constexpr T calculate(const T (&arr)[N]) {
T maxVal = arr[0];
for (std::size_t i = 1; i < N; ++i) {
if (arr[i] > maxVal) {
maxVal = arr[i];
}
}
return maxVal;
}
};
函数对象在模板元编程中的优势
- 封装状态:函数对象可以在类中存储成员变量,这在模板元编程中可以用来保存一些中间结果或状态。相比之下,普通函数和模板函数没有这种能力,它们是无状态的(除了静态局部变量,但这在编译期计算中通常不可用)。
- 多态性:函数对象可以实现多态行为,通过重载
()
运算符。这使得在模板元编程中,可以根据不同的类型参数实现不同的计算逻辑,而普通函数在编译期难以实现这种动态的行为选择。
- 可作为模板参数:函数对象可以作为模板参数传递,方便在不同的模板实例化中使用不同的计算策略。普通函数虽然也能作为模板参数,但函数对象提供了更丰富的功能,因为它可以携带额外的状态和行为。