Conforme mostrado na cppreference.
A auto
palavra-chave pode ser usada para se livrar do modelo com concept
.
// Constrained C++20 function template:
template<Hashable T>
void f(T) {}
//
// Alternative ways to apply the same constraint:
// template<typename T>
// requires Hashable<T>
// void f(T) {}
//
// template<typename T>
// void f(T) requires Hashable<T> {}
//
void f(Hashable auto /* parameter-name */) {}
Minha pergunta é como usar a mesma técnica auto
quando tenho dois parâmetros de modelo.
template<typename T1, typename T2> concept MyConcept<T1, T2> = ....
template<typename T1, typename T2>
void func(MyConcept<T1, T2> c) { ... }
// Why cannot use :
void func(MyConcept auto c) { ... }
Você não. Essa sintaxe só funciona nos casos mais simples. Quando um conceito é baseado em um único parâmetro de modelo de tipo, esse tipo pode ser assumido como o tipo deduzido do argumento (e se não for, então você terá que fazer as coisas de forma diferente de qualquer maneira). Mas quando um conceito é baseado em múltiplos parâmetros, qual é o tipo para o argumento, e de onde vem o outro tipo?
Você tem que soletrar isso por extenso com uma
requires
cláusula adequada.