Привет. Не могу понять, почему не получается заменить это:
#include <tuple>
#include <type_traits>
using namespace std;
template <typename Tuple, size_t i=0>
requires (i >= tuple_size_v<Tuple>)
consteval bool check_visitor() {
return true;
}
template < typename Tuple, size_t i=0>
requires (i < tuple_size_v<Tuple>)
consteval bool check_visitor() {
static_assert(! is_same_v<tuple_element_t<i, Tuple>, bool>);
return check_visitor<Tuple, i+1>();
}
int main() {
using T = tuple<int, double, char>;
check_visitor<T>();
}
на это:
#include <tuple>
#include <type_traits>
using namespace std;
template < typename Tuple, size_t i=0>
consteval bool check_visitor() {
static_assert(! is_same_v<tuple_element_t<i, Tuple>, bool>);
if constexpr (i < tuple_size_v<Tuple>)
return check_visitor<Tuple, i+1>();
else
return true;
}
int main() {
using T = tuple<int, double, char>;
check_visitor<T>();
}
Выражение в if constexpr зависит от параметров шаблона, как говорит справочник - в таком случае неактивная ветка должна полностью исчезнуть при инстанцировании, хоть ODR используй там необъявленное.