Почему c ++ 11 определяет get <> (tuple) как глобальную функцию, но не является членом tuple? - PullRequest
0 голосов
/ 12 сентября 2018

Кажется, std::get просто используется в классе кортежей.Почему бы не сделать его членом класса кортежей в стандартной библиотеке, в других случаях?

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Существует также более старая, менее специфичная для c ++ 11 и, как правило, более общая версия ответа.(Если вас интересует только конкретный случай, вам не нужно читать дальше).

Общий случай свободных функций описан в этой классической статье DrDobb абсолютным гуру C ++.

Короткая и приятная версия: если вы разделяете открытый интерфейс сдоступ к закрытым членам и общедоступному интерфейсу с доступом только к общедоступному интерфейсу. У вас более сложное разделение между классом и операциями над этим классом.

Это выглядит несколько уродливо, снижает полезность большинства IDE, но имеет некоторые глубокие последствияна модульность вашего кода, особенно когда вы принимаете шаблонное безумие последних std итераций.Ответ Матиаса изображает один яркий пример этого.

Более классическим преимуществом является то, что вы можете предоставить набор бесплатных функций внутри дополнительного заголовка, который пользователь может включить по требованию.Теперь подумайте о взаимодействии между шаблонными, но в остальном совершенно отдельными классами A и B.Теперь вы можете связать их вместе, предоставив заголовок наподобие A_B_interop.h, полный бесплатных функций, без переключения парадигм.Если вы включите этот заголовок, классы станут более мощными.

0 голосов
/ 12 сентября 2018

Причина, по которой get является функцией, не являющейся членом, состоит в том, что если бы эта функциональность была предоставлена ​​как функция-член, то для кода, для которого тип, зависящий от параметра шаблона, потребовалось бы использовать ключевое слово template.

source .

Фрагмент кода, когда get не является функцией-членом:

template<class T>
void foo ( tuple<T>& t ) {
    get<0>(t) = 10; // get is non-member function
}

и другой, если get является функцией-членом кортежа:

template<class T>
void foo ( tuple<T>& t ) {
    t. template get<0>() = 10; // ugly
}

Какую версию get вы предпочитаете?Для меня первый лучше.

...