Pull to refresh
3
0
Василий Бегемотов @Foxeed

Программист

Send message
Про «привычную с виду» const-функцию: надо бы тогда было отдельный параграф завести, но вообще это не проблема 17-х плюсов, она старее. Лично я эту часть статьи прочел как ненужное отступление от темы.

Если все-таки темой статьи было скрытое обсуждение type deduction в разрезе SB, то тогда стоило так и назвать ее, меня бы тогда ничего не смутило. :) Потому что просто SB — то, на что я дал ссылку выше. Задуманное использование максимально простое: там, где раньше надо было бы использовать std::tie, теперь можно наставить квадратных скобок.

А с предложенным кодом у меня есть два варианта прочтения:
1) Если действительно надо связывать одну переменную с другой вот таким способом… это ужасное нарушение инварианта класса. Потому что int& _bar из примера — приватное поле Foo, его действительно стоит таким образом выставлять наружу? Успокойте что это не так. Это даже закрывая глаза на нецелевое использование инструмента, которым планировалось легко возвращать несколько переменных из одной функции.

2) Наверное, связывание будет минимум на 2-3 переменные, и что тогда, чтобы прочесть такой код и быть уверенным, что всё в порядке, мне надо пойти в определения этих 2-3 типов и посмотреть где же у них там std::tuple_element_t<i, Foo> мелькает? И потом держать это в голове? Наивно предполагать, что так хоть кто-то будет делать больше одного раза. Это очень хрупкий код, который теряет в самодокументируемости практически сразу.

По мне так и то, и то — повышает хрупкость кода без видимых плюсов. В будущем, когда больше людей так будут делать, это должно стать антипаттерном.
Сначала претензия к коду, потом вопрос. Вот это:
template<>
std::tuple_element_t<0, Foo> const& Foo::get<0>() const
{
    return _bar;
}

ничем не отличается от этого:
template<>
std::tuple_element_t<0, Foo> & Foo::get<0>()
{
    return _bar;
}

О таком clang даже из коробки с -Wall сообщает:
warning: 'const' qualifier on reference type 'std::tuple_element_t<0, Foo>' (aka 'int &') has no effect [-Wignored-qualifiers].

Теперь к делу. Structured binding имеет вполне понятные подводные камни со ссылками, и вы итак об этом должны были знать, потому что cppreference читали перед написанием статьи. Простой пример, надо обратить внимание на '&':
#include <tuple>

std::tuple<int, float> foo();

int main()
{
  auto [a, b] = foo();
}
превращается в:
#include <tuple>

std::tuple<int, float> foo();

int main()
{
  std::tuple<int, float> __foo7 = foo();
  std::tuple_element<0, std::tuple<int, float> >::type& a = std::get<0UL>(__foo7);
  std::tuple_element<0, std::tuple<float> >::type& b = std::get<1UL>(__foo7);
}


Вопрос: зачем при связывании подсовывать другой тип? Я не вижу ни одного нормального юзкейса, где бы это пригодилось — очень похоже на антипаттерн. Канонический пример, где был бы нужен SB вот такой:
if (auto [ iter, success ] = my_set.insert("Hello"); success) do_something_with(iter);


А теперь посмотрите только на свой пример:
Foo foo;
const auto& [f1] = foo;

Каким образом я, как читатель кода, пойму какой тип имеет f1 (опустим вопрос использования SB для одной переменной), если я не видел метафункций для Foo? Почему я должен предполагать, что передо мной ссылка на инт?
Начиная с gcc 5.1 и clang 3.1 триграфов уже нет, но диграфы еще остались. Забавно, но IBM использует триграфы (Appendix A).
Полностью подписываюсь под всем, но хотел бы еще добавить, что, например, архитектором невозможно стать, не принимая мелких решений по библиотекам/фреймворкам/утилитам, которые будут в тулчейне использоваться.
В сообщении, на которое вы ответили, вообще не предполагается, что человек из одной области может в другую перейти — какие-то дискретные непересекающиеся области получаются. А в реальности стать, к примеру, devops нельзя, никогда не программировав, имея только опыт развертывания чего-то в вакууме или какие-то системные понятия. Очень сомнительные советы.

Задача итак решена, просто не эстетично. Разговор про то, чтобы не писать велосипеды в дальнейшем.

Вы не видите разницы между сторонними библиотеками и тем, что предоставляет чистый C++11?
Нет в одиннадцатых плюсах ни поддержки сети, ни поддержки файловой системы. И тут почти всегда выруливает буст.
Есть такой бородатый сайт про UTF-8, проще на него ссылку кидать, чем каждый раз писать про преимущества UTF-8. :) И по-хорошему надо всегда использовать только ее для всех внутренних представлений, а если очень необходимо снаружи библиотеки иметь другую кодировку, конвертировать в нее по требованию.
Простите, но как называется стиль подсветки кода из картинки?
Это один человек наиграл, думаешь, таких много? Большинство людей про хоткеи даже не знают, как они баланс будут оценивать? Лучше бы только с айсикапа людей в бету пускали — толку было бы больше. 8)
Опять на деньги разводят, только теперь тоннелями заманивают. ыыы, чё там в Аляске-то нам делать? Там же жить невозможно, только как дорога к пентагону получается. :)
Скорее, е-бизнесмены чистейшие. :)
Не вижу смысла использовать п2п для того, чтобы лицензионно скачивать что-то. Оно же пиратское до последнего байта. :) Да и непривычно будет лицензионщину качать из п2п. Но это моё имхо, лично мне так удобнее. Дома лицензионные диски есть и не одна штука. Там качество cda, а не голимое 128кБс мп3.
позади планеты всей...
А что поделаешь? Страшно, но жизнь не останавливается? :(

Про вики: википедия, всё-таки, энциклопедия, а не газета. Но, каким содержанием энтузиасты наполнят, то и получится...
Сделали бы разделение по языкам как в википедии, было бы замечательно.
Окей, напишу. :)
Будут старьё раздавать и ещё рекламой потчевать, наверное. Я лично не буду этим сервисом пользоваться, даже если его запустят, лучше скачаю в той же п2п-проге целую пачку альбомов за то же время. :)

Information

Rating
Does not participate
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Registered
Activity