所以,我有许多constexpr std::array<int, N>
,针对不同的N
值。在这种情况下:
constexpr std::array<int, 3> r1 {1, 3, 5};
constexpr std::array<int, 2> r2 {3, 4};
constexpr std::array<int, 4> r3 {1, 2, 5, 6};
constexpr std::array<int, 2> r4 {2, 6};
我想要做的是找到所有array
中的constexpr
max
(以及随后的min
)元素。这似乎可以正常工作:
constexpr int the_max() {
return 0;
}
template<typename T, typename... Ts>
constexpr int the_max(T&& t, Ts&&... ts) {
const int v = *std::max_element(t.cbegin(), t.cend());
return std::max(v, the_max(ts...));
}
如下所示:
constexpr auto max_entry = dlx::the_max(r1, r2, r3);
std::cout << max_entry << '\n';
打印输出结果为6,这是预期的。
然而,感觉应该有更多的逻辑,例如:
默认值或最小值;以及
std::array
中的类型应该可以不同,只要它们都是算术类型。
我认为下面的代码也应该有效:
template<typename B>
constexpr std::enable_if_t<std::is_arithmetic_v<B>, B>
the_max2(B&& b) {
return b;
}
template<typename B, typename T, typename... Ts>
constexpr std::enable_if_t<std::is_arithmetic_v<B> && std::is_arithmetic_v<T::value_type>, std::common_type_t<B, typename T::value_type>>
the_max2(B&& b, T&& t, Ts&&... ts) {
const int v = *std::max_element(t.cbegin(), t.cend());
return std::max(v, the_max2(ts...));
}
但是它会出现错误:
error: no matching function for call to 'the_max2<int>(int, const std::array<int, 3>&, const std::array<int, 2>&, const std::array<int, 4>&)'
只期望1个参数,但收到了4个参数,并且:
error: 'value_type' is not a member of 'const std::array<int, 3>&'
有人能告诉我我做错了什么吗?非常感谢您的帮助。
typename
,应该是std::is_arithmetic_v<typename T::value_type>
。 - 273K