【发布时间】:2018-10-29 01:56:17
【问题描述】:
所以,对于N 的各种值,我有多个constexpr std::array<int, 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};
我想做的是在所有arrays 中找到constexprmax(以及随后的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<T::value_type>。
标签: templates c++14 c++17 variadic-templates template-meta-programming