Используя дедукцию аргументов шаблона класса C ++ 17, вы сможете сделать что-то вроде этого:
template<typename A, typename B, typename C>
struct mytype { };
template<class T>
concept C1 = requires(T x) {
{ mytype{x} } -> T;
};
mytype{x}
использует вывод аргумента шаблона класса для вывода A
, B
и C
, так что это допустимо, если вы можете построить mytype<A, B, C>
из T
. В частности, это допустимо, если mytype
можно копировать, поскольку у вас есть неявно объявленное руководство по удержанию копии , подобное:
template <typename A, typename B, typename C>
mytype(mytype<A, B, C>) -> mytype<A, B, C>;
Проверка того, что T
также является созданным экземпляром mytype
, избегает сопоставления с другими руководствами по выводам, например, это будет соответствовать для любого типа без -> T
:
template <class A, class B, class C>
struct mytype {
mytype(A);
};
template <class A>
mytype(A) -> mytype<A, A, A>;
Предложенное решение не работает для классов, не конструируемых для копирования, хотя должно быть возможно, чтобы оно работало для классов, предназначенных только для перемещения.
Протестировано с: