Сообщение Re[2]: Вопрос по std::variant от 07.06.2025 5:57
Изменено 07.06.2025 6:08 rg45
Re[2]: Вопрос по std::variant
Здравствуйте, Кодт, Вы писали:
К>для связности:
К>https://rsdn.org/forum/cpp/8497841.1
По прошествии времени смотрю на этот свой пост
И std::decay_t здесь не нужен, если разобраться.
А вот, что имело бы смысл сделать, так это ослабить могущество перегрузки по умолчанию, сменив тип её формального параметра с auto&& на const auto&. Другой, вариант, как сделать умолчательную перегрузку ещё менее специальной — это добавить фейковый вариадик пак в конце: [](auto&&, auto&&...) { }
К>для связности:
К>https://rsdn.org/forum/cpp/8497841.1
Автор: Chorkov
Дата: 04.04.23
Дата: 04.04.23
По прошествии времени смотрю на этот свой пост
Автор: rg45
Дата: 08.04.23
, как на вредный совет. Сейчас бы я сделал так:Дата: 08.04.23
template<class T> concept has_foo = requires (T t) { t.foo(0); };
template<class T> concept has_bar = requires (T t) { t.bar(""); } /*and not has_foo<T>*/;
....
visit(your_tuple,
overloaded{
[](has_foo auto&& t) { t.foo(123); },
[](has_bar auto&& t) { t.bar("hello"); },
[](auto&& t) { }, // без констрейнов имеет меньший приоритет, чем с констрейнами
}
);И std::decay_t здесь не нужен, если разобраться.
А вот, что имело бы смысл сделать, так это ослабить могущество перегрузки по умолчанию, сменив тип её формального параметра с auto&& на const auto&. Другой, вариант, как сделать умолчательную перегрузку ещё менее специальной — это добавить фейковый вариадик пак в конце: [](auto&&, auto&&...) { }
Re[2]: Вопрос по std::variant
Здравствуйте, Кодт, Вы писали:
К>для связности:
К>https://rsdn.org/forum/cpp/8497841.1
По прошествии времени смотрю на этот свой пост
И std::decay_t здесь не нужен, если разобраться.
А вот, что имело бы смысл сделать, так это ослабить могущество перегрузки по умолчанию, сменив тип её формального параметра с auto&& на const auto&. Другой, вариант, как сделать умолчательную перегрузку ещё менее специальной — это добавить фейковый вариадик пак в конце: [](auto&&, auto&&...) { }
К>для связности:
К>https://rsdn.org/forum/cpp/8497841.1
Автор: Chorkov
Дата: 04.04.23
Дата: 04.04.23
По прошествии времени смотрю на этот свой пост
Автор: rg45
Дата: 08.04.23
, как на вредный совет. Сейчас бы я сделал так:Дата: 08.04.23
template<class T> concept has_foo = requires (T t) { t.foo(0); };
template<class T> concept has_bar = requires (T t) { t.bar(""); } and not has_foo<T>;
....
visit(your_tuple,
overloaded{
[](has_foo auto&& t) { t.foo(123); },
[](has_bar auto&& t) { t.bar("hello"); },
[](auto&& t) { }, // без констрейнов имеет меньший приоритет, чем с констрейнами
}
);И std::decay_t здесь не нужен, если разобраться.
А вот, что имело бы смысл сделать, так это ослабить могущество перегрузки по умолчанию, сменив тип её формального параметра с auto&& на const auto&. Другой, вариант, как сделать умолчательную перегрузку ещё менее специальной — это добавить фейковый вариадик пак в конце: [](auto&&, auto&&...) { }