Как лучше всего использовать shared_ptr с MPFR (mpfr_t, mpfr_ptr, ... =)? - PullRequest
0 голосов
/ 06 августа 2020

Я не могу заставить MPFR (обычная C версия) работать чисто с shared_ptr. Поскольку у меня уже есть код C, я просто хочу иметь небольшую «обертку», которая делает shared_ptr s из простых C указателей, которые у меня уже есть.

root проблемы I думаю, это определение mpfr_t как массива размером 1 из __mpfr_struct в mpfr.h, что, кажется, вызывает проблемы.

typedef __mpfr_struct mpfr_t[1];

В C Я просто использовал массивы mpfr_t с указатели без проблем.

mpfr_t* someArr = (mpfr_t*) malloc(someSize*sizeof(mpfr_t))

И я просто хочу обернуть что-то вроде someArr в shared_ptr Но теперь, когда я пытаюсь что-то сделать с C ++ и shared_ptr

#include <memory>
#include "mpfr.h"
struct myDeleter{
    size_t nn;
    myDeleter(size_t nIn){
        nn = nIn;
    };
    void operator()(mpfr_t* ptr){
        for (size_t ii = 0; ii < nn; ii++) {
            mpfr_clear(ptr[ii]);
        };
        free(ptr);
    };
};
std::shared_ptr<mpfr_t> ptr_to_sptr (mpfr_t* ptr, size_t nn) {
    std::shared_ptr<mpfr_t> sp;
    myDeleter deleter(nn);
    sp.reset(ptr, deleter);
    return sp;
};

Я получаю сообщение об ошибке

error: no matching function for call to ‘std::shared_ptr<__mpfr_struct [1]>::reset(__mpfr_struct (*&)[1], myDeleter&)’

, которое, вероятно, вызвано «странным» определением mpfr_t как массива (работают другие типы данных).

Мне действительно нужно использовать определение, например std::shared_ptr<__mpfr_struct> или что-то еще, и всегда приводить между моим старым C и новым кодом C ++ или есть что-то, что я упускаю? Почему shared_ptr просто не принимает mpfr_t (я использую C ++ 20, который добавил поддержку массивов (например, int[]) для shared_ptr в других отношениях)?

...