Considere o seguinte código:
#include <concepts>
struct T1 {};
struct T2 {};
struct T3 {};
struct T4 {};
void bar(T1, T2, T3, T4) {
}
template<typename T>
concept IsT = std::same_as<T, T1> || std::same_as<T, T2> ||
std::same_as<T, T3> || std::same_as<T, T4>;
void foo(IsT auto x1, IsT auto x2, IsT auto x3, IsT auto x4) {
// How to order the types of x1, x2, x3, x4 and call bar(x?, x?, x?, x?)?
}
int main() {
foo(T1{},T2{},T3{},T4{}); // ok
foo(T4{},T3{},T2{},T1{}); // ok
foo(T3{},T2{},T1{},T4{}); // ok
// ...
}
Minha intenção é simples:
O usuário pode chamar
foo
em qualquer ordem de argumentos, mas finallybar
será chamado com os argumentos na ordem correta.
A solução trivial é usar força bruta para dividir os 24 casos, o que é obviamente tedioso e propenso a erros.
Existe uma maneira sem força bruta de resolver esse problema? Estou usando C++20.
Como os tipos são diferentes, você pode envolvê-los em uma tupla e obter os tipos corretos depois:
Demonstração