Я много звонил 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 Я подумал, что, возможно, ответ связан с совместимостью с C.
Трудно сделать его совместимым с C, если вы используете классы;)
Вы можете создать свой собственный класс из mpz_class и присвоить этому классу operator mpz_t. Однако это все равно не даст вам прямого преобразования из mpz_class, потому что тогда у вас будет два пользовательских преобразования.
Для этого примера вы должны просто написать a=gcd(b,c). Не должно быть так много функций, которые требуют прохождения через интерфейс C (mulmod является наиболее распространенным, потому что (a*b)%c не расширяется до mulmod).





Почему бы не написать собственную функцию-оболочку?
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 Авторы могли бы написать это так, чтобы было автоматическое преобразование из mpz_class в mpz_t (или mpz_ptr или mpz_srcptr), но включение таких автоматических преобразований часто вносит двусмысленность в код. Может быть, это было причиной.
Какой смысл иметь в библиотеке и mpz_class, и mpz_t?
mpz_t совместим с C, но требует, чтобы вы сами управляли памятью. mpz_class был написан на C++, чтобы освободить вас от управления памятью, но это слой поверх mpz_t, а не полная переработка. Таким образом, оба существуют, потому что они служат различным потребностям.
Проще говоря, mpz_t предназначен для C, а mpz_class для C++?
Почему вы отметили это буквой С?