Можно ли как-то опустить `get_mpz_t()`?

Я много звонил get_mpz_t() по mpz_class типам. Я действительно не понимаю, в чем дело. У меня красный документация, и насколько я могу судить, он нужен только потому, что некоторые функции требуют mpz_t, а не mpz_class?

Чтобы скопировать пример, приведенный в документации, я часто вызываю его в подобной ситуации, но с различными функциями:

mpz_class a, b, c;
...
mpz_gcd (a.get_mpz_t(), b.get_mpz_t(), c.get_mpz_t());

Если единственная разница заключается в синтаксисе, можно ли его опустить или автоматизировать, чтобы мне не приходилось его много печатать? Я гораздо лучше знаком с C++, чем с C.

Почему вы отметили это буквой С?

klutt 17.06.2019 10:37

@klutt Я подумал, что, возможно, ответ связан с совместимостью с C.

northerner 17.06.2019 10:40

Трудно сделать его совместимым с C, если вы используете классы;)

klutt 17.06.2019 10:40

Вы можете создать свой собственный класс из mpz_class и присвоить этому классу operator mpz_t. Однако это все равно не даст вам прямого преобразования из mpz_class, потому что тогда у вас будет два пользовательских преобразования.

MSalters 17.06.2019 13:04

Для этого примера вы должны просто написать a=gcd(b,c). Не должно быть так много функций, которые требуют прохождения через интерфейс C (mulmod является наиболее распространенным, потому что (a*b)%c не расширяется до mulmod).

Marc Glisse 17.06.2019 13:09
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
136
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Почему бы не написать собственную функцию-оболочку?

inline void mpz_gcd(mpz_class& a, const mpz_class& b, const mpz_class& c)
{
    mpz_gcd(a.get_mpz_t(), b.get_mpz_t(), c.get_mpz_t());
}

Учитывая, что это C++, вы даже можете дать функции-оболочке то же имя, что и оригиналу.

Спасибо. Хотя я нахожу, что вызываю это во многих разных функциях, например. mod pow, perfect power и т. д. Мне было больше интересно, может ли кто-нибудь подтвердить мое понимание, что это просто правильный синтаксис?

northerner 17.06.2019 10:45

@northerner Авторы могли бы написать это так, чтобы было автоматическое преобразование из mpz_class в mpz_t (или mpz_ptr или mpz_srcptr), но включение таких автоматических преобразований часто вносит двусмысленность в код. Может быть, это было причиной.

john 17.06.2019 10:48

Какой смысл иметь в библиотеке и mpz_class, и mpz_t?

northerner 17.06.2019 10:50
mpz_t совместим с C, но требует, чтобы вы сами управляли памятью. mpz_class был написан на C++, чтобы освободить вас от управления памятью, но это слой поверх mpz_t, а не полная переработка. Таким образом, оба существуют, потому что они служат различным потребностям.
john 17.06.2019 11:11

Проще говоря, mpz_t предназначен для C, а mpz_class для C++?

northerner 17.06.2019 11:22

Другие вопросы по теме