C++ скрытый уникальный указатель

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

Типичным примером этого являются источники решения OpenFOAM.

Поскольку схема этого кода носит процедурный характер, но я хочу поместить все это в класс, который обеспечивает init(), run() и, возможно, release(), я планирую поместить некоторые переменные в классы как частные, делая их члены.

Я не хочу изменять включенные файлы, потому что они принадлежат библиотеке.

Причина использования класса в том, что другие классы подпрограмм работают вместе с этим кодом.

Вот эта вещь. init() должен подготовить некоторую переменную, и в таких ситуациях эти переменные (являющиеся типом других выражений) не являются явными конструкторами и специальными аргументами. Это называется один раз. run() вызывается несколько раз. В процедурном коде есть только цикл, и содержимое этого цикла помещается в метод run ().

Поэтому лучшим решением было поместить эти переменные в std::unique_ptr, и init может создать все, что ему нужно. Очевидно, с помощью этого трюка изменилась сигнатура переменной, поэтому я создал второе объявление ссылки следующим образом:

    std::unique_ptr<volScalarField> mp_p;
    volScalarField &p = *mp_p;

Теперь это немного утомительно, поэтому я создал макрос

    FOAMPTR(volVectorField, p)

которая делает всю работу за меня:

    #define FOAMPTR(TYPE,NAME) std::unique_ptr<TYPE> mp_##NAME; TYPE &NAME=*mp_##NAME

Это работает довольно хорошо, но я не фанат макросов в целом, особенно если вам нужно отлаживать код.

Теперь мой вопрос: есть ли лучший способ решить эту проблему и использовать что-то еще, например, определение шаблона, которое может сделать всю магию?

Редактировать: с "работает довольно хорошо" я имею в виду, что компилятор может перевести это. Ссылка, хотя все еще является недействительной.

Редактировать: Хорошо, я решил проблему неверного указателя с помощью двух макросов:

    #define FOAMPTR(TYPE,NAME) std::unique_ptr<TYPE> mp_##NAME
    #define FETCHFOAMREF(NAME) auto &NAME=*mp_##NAME

Теперь я положил FOAMPTR(TYPE,NAME) члену, и я получаю свои уникальные ptrs. в run() метод второй макрос FETCHFOAMREF(NAME) используется. Конечно, init () должен обязательно правильно инициализировать объект, иначе программа будет аварийно завершена.

Я все еще оставляю вопрос открытым, потому что я не удовлетворен этим решением.

0 ответов

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