#include
struct T1 {};
struct T2 {};
struct T3 {};
struct T4 {};
void bar(T1, T2, T3, T4) {
}
template
concept IsT = std::same_as || std::same_as ||
std::same_as || std::same_as;
void foo(IsT auto x1, IsT auto x2, IsT auto x3, IsT auto x4) {
// How to sort 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
// ...
}
Мое намерение простое:
Пользователь может вызвать foo в любом порядке аргументов, но, наконец,
будет вызываться в отсортированном порядке аргументов.
Тривиальное решение — использовать грубую силу для разделения 24 случаев, что, очевидно, утомительно и подвержен ошибкам. Есть ли элегантный способ решить эту проблему в C++20?
void foo(IsT auto x1, IsT auto x2, IsT auto x3, IsT auto x4) { // How to sort 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 // ... } [/code] Мое намерение простое:
Пользователь может вызвать foo в любом порядке аргументов, но, наконец, [code]bar[/code] будет вызываться в отсортированном порядке аргументов.
Тривиальное решение — использовать грубую силу для разделения 24 случаев, что, очевидно, утомительно и подвержен ошибкам. [b]Есть ли элегантный способ решить эту проблему в C++20?[/b]