Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Я ответил в том смысле, что с извращениями могу и сам, а менять одно извращение (традиционный сишный развесистый стиль, в котором все хотя бы хорошо видно и управляемо) на ненавистную магию (которая радует исключительно до того момента, когда из-за какой-нибудь мелкой ошибки все уродливые потроха этой магии не вылезут наружу) просто не вижу смысла.
Ну вот смотри, ты называешь предлагаемый мной подход извращением, не только не зная его реализации, но даже не представляя сценариев использования. Невольно возникает вопрос: а на чём ты основываешься в своих суждениях? Исключительно на каких-то личных неудачах, так ведь?
А между тем, мой подход, возможно, не прост в реализации, зато даёт как нельзя более простое и естественное использование. Например, рекурсивный обход дерева конфигурационных параметров из
этого примераАвтор: rg45
Дата: 14.12 23:23
мог бы выглядеть примерно так (сразу два варианта):
//---------------------------------------------------------------------------------
auto SomeOperation(Numeric auto&&) {/*. . .*/}
auto SomeOperation(String auto&&) {/*. . .*/}
auto SomeOperation(Range auto&&) {/*. . .*/}
auto SomeOperation(Aggregate auto&& t)
{
return aggregates::Apply(t, [](auto&&...x){ return (SomeOperation(x) | ...); });
}
//---------------------------------------------------------------------------------
struct {
constexpr auto operator()(Numeric auto&&) const {/*. . .*/}
constexpr auto operator()(String auto&&) const {/*. . .*/}
constexpr auto operator()(Range auto&&) const {/*. . .*/}
constexpr auto operator()(auto&&...) const {/*. . .*/}
constexpr auto operator()(Aggregate auto&& t) const { return aggregates::Apply(t, *this}); }
} inline constexpr AnotherOperation;
//---------------------------------------------------------------------------------
struct {
// . . .
} inline constexpr Config;
int main()
{
SomeOperation(Config);
AnotherOperation(Config);
}
Понятно, что разных нюансов использования может быть гораздо больше, чем показано в примере. И операции могут быть как run-time, так и compile-time. Весь фокус, как можно догадаться, находится внутри aggregates::Apply, который лежит потихоньку в отдельном файле и есть не просит.
Вот теперь и суди, что является извращением, а что нет.