суббота, 20 апреля 2019 г.

[prog.c++] Тот случай, когда жалко, что C++ный if constexpr не дотягивает до D-шного static if :(

Хорошо, когда C++ со временем впитывает в себя хорошие штуки из других языков программирования. Вот тот же if constexpr из C++17 явно позаимствован из D. Жаль только, что static if в D может применяться в большем количестве контекстов, чем if constexpr в C++.

Был бы в C++17 if constexpr таким же мощным, как static if в D, я бы мог написать вот такой вот код сходу, не сильно задумываясь:

среда, 17 апреля 2019 г.

[prog.c++] Кому-нибудь будет интересна еще одна статья про C++ные навороты с шаблонами и наследованием?

Хочу обратиться с вопросом к читателям, которым еще интересно читать про мои извращения с C++ными возможностями. Недавняя статья про CRTP и прочую C++ную магию зашла, надеюсь, более-менее нормально. Хотя, как я вижу, на Хабре статьи про C++ не так уж популярны и тенденция к падению интереса к статьям про C++, имхо, прослеживается. Поэтому прежде чем браться за написание очередной статьи, хочется понять, будет ли моя работа востребована.

Суть в том, что я сейчас закончил адаптацию базирующегося на Asio диспетчера для SO-5.6. И в этой реализации полно всяких C++ных штук. Тут есть и шаблоны, и CRTP, и наследование как от шаблонов, так и не от шаблонов, включая нелюбимое многими наследование реализации.

Когда смотришь на все это со стороны, то создается впечатление хардкора и оверкилла, от которого следует избавиться раз и навсегда, а автора сего безобразия -- выгнать из профессии на мороз. Нет, серьезно. У меня вчера у самого были такие мысли, когда я в этот код погрузился впервые за полтора года.

Собственно, каждый желающий может сам составить свое впечатление. Текущий вариант реализации зафиксирован здесь. Можно обратить внимание, например, на thread_local_ptr_holder_t (стр.423), на его наследника work_thread_t (стр.466) и на его наследников work_thread_without_activity_tracking_t (стр.575) и work_thread_with_activity_tracking_t (стр.677). Либо на basic_binder_impl_t (стр.716) и его наследников binder_template_t (стр.790), binder_with_external_strand_t (стр.831) и binder_with_own_strand_t (стр.863). Не говоря уже про basic_dispatcher_skeleton_t и то, что идет дальше :)

Тем не менее, код есть, он работает. Я сделал его максимально простым и понятным, насколько смог. И в нем используются разные C++ные возможности. Причем используются не просто так, а чтобы облегчить мой труд. При том, что я далеко не самый лучший в мире разработчик и работать с реально сложным кодом у меня не хватает мозгов. И раз это помогает мне, то может быть поможет и еще кому-нибудь. Собственно об этом можно было бы и рассказать в отдельной статье.

Однако, написание статьи -- это время и труд, которые вполне могут быть направлены и на другие задачи. Поэтому, если кому-то интересно читать про подобные трюки, то дайте знать. Если никто не отзовется, то это сэкономит мне некоторое время (а время ресурс не восполняемый, к сожалению).