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 () должен обязательно правильно инициализировать объект, иначе программа будет аварийно завершена.
Я все еще оставляю вопрос открытым, потому что я не удовлетворен этим решением.