Используя вывод аргументов шаблона класса C ++ 17, вы сможете сделать что-то вроде этого:
template<typename A, typename B, typename C>
struct mytype { };
template<class T>
concept C1 = requires(T x) {
{ mytype{x} } -> std::same_as<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
, избегайте сопоставления с другими руководствами по дедукции, например, это будет соответствовать любому типу без -> std::same_as<T>
:
template <class A, class B, class C>
struct mytype {
mytype(A);
};
template <class A>
mytype(A) -> mytype<A, A, A>;
Предлагаемое решение не работает для классов, не поддерживающих копирование, хотя должно быть возможно заставить его работать для классов, предназначенных только для перемещения.
Протестировано с:
person
Holt
schedule
14.01.2019
template<typename A, typename B, typename C> void do_stuff(mytype<A, B, C>)
вы можете простоtemplate<MyType T> do_stuff(T)
. И, надеюсь, однаждыdo_stuff(MyType T)
, как и предполагал Страуструп. - person MrMobster   schedule 14.01.2019do_stuff(MyType auto T)
- это гораздо более тупое написание того, что вы действительно хотите, поскольку вам нужно отследить шаблонMyType
, чтобы понять, что он означает создание экземпляраmytype
. Я считаю, что это ничем не отличается от решения заменитьmy_func(int i)
наmy_func(Int auto i)
или что-то подобное. - person Nicol Bolas   schedule 15.01.2019do_stuff
не использует эти параметры шаблона, почему я хочу, чтобы моя функция шаблонаdo_stuff
принимала толькоmytype
создание экземпляра? Почему бы мне не написать правильный концептуальный интерфейс, против которогоdo_stuff
можно было бы писать? Тот, который не явно зависит от самогоmytype
? Не похоже, чтоrange::sort
написано специально противvector
; он написан против любого диапазона произвольного доступа;vector
просто предоставляет этот интерфейс. - person Nicol Bolas   schedule 15.01.2019