Такая рекурсивная проверка шаблона возможна, но это затрудняет чтение кода. Принцип состоит в том, чтобы направить рекурсивную проверку шаблона функции, найденной зависимым поиском имени, чьи ограничения будут проверены только в том случае, если тип еще не принадлежит к списку уже проверенных типов ... Если тип принадлежит к списку уже отмеченный тип, функция отключена SFINAE, а другая функция, которая не рекурсивно ссылается на концепцию, выбирается разрешением перегрузки:
Посмотрите, как это работает: ссылка на компилятор-проводник
#include <type_traits>
namespace trying{
struct to_do{};
template <class...Checked, class T>
std::enable_if_t <(std::is_same_v <T,Checked> || ...), std::true_type>
too_complex(T &&, to_do);
template <class...Checked, class T>
std::false_type
too_complex(T &&,...);
}
template <class U, class T, class...Checked>
concept Integer_= requires(const T& a, const T& b, const U& to_be_readable)
{
requires decltype(too_complex <T, Checked...> (a + b, to_be_readable))::value ;
};
template <class T, class...Checked>
concept Integer = Integer_ <trying::to_do, T, Checked...>;
namespace trying{
template <class...Checked, class T>
requires (Integer <T, Checked...>)
std::enable_if_t <!(std::is_same_v <T,Checked> || ...), std::true_type>
too_complex(T &&, to_do);
}
struct x{
auto
operator + (x) const -> int;
};
struct y{
auto
operator + (y) const -> void*;
};
struct z2;
struct z1{
auto
operator + (z1) const -> z2;
};
struct z2{
auto
operator + (z2) const -> z1;
};
static_assert (Integer <int>);
static_assert (Integer <x>);
static_assert (!Integer <y>);
static_assert (Integer <z1>);
static_assert (Integer <z2>);
Так что да, это возможно ... но я не думаю, что это нужно делать.
person
Oliv
schedule
20.05.2020
T
вместоInt
или{ a + b } -> T;
? - person Mestkon   schedule 20.05.2020std::same_as<T>
илиstd::convertible_to<T>
. Но ни один из них не проверяет, что за OP. Представьте, еслиa + b
приведет к типуU
, который не являетсяT
и не может быть преобразован в него. OP спрашивает, соответствует ли он той же концепции. - person StoryTeller - Unslander Monica   schedule 20.05.2020{ ... } -> std::same<T>
или{ ... } -> std::convertible_to<T>
- person Nazinho   schedule 20.05.2020{ a + b } -> Int
? Я думал, что `-› Int` не был включен в окончательный стандарт. - person darcamo   schedule 20.05.2020-> ConceptName
нормально. Это-> TypeName
не работает. - person Nicol Bolas   schedule 20.05.2020A+A -> B
иB+B->A
, похоже, позволяют обоим результатам A и B передавать концепцию, или, наоборот, оба не передают концепцию ... - person Jarod42   schedule 20.05.2020