Комментарии 18
Вы уверены что можно объявить функцию которая принимает/возвращает тип, объявленный через forward declaration? И какой в этом смысл если в любой точке вызова надо иметь полное объявление.
Интеллектуальный указатель - общепринятый перевод это «умный указатель»
Да, это так. Я сам сильно удивился, когда прочитал об этом в [Meyers1]. Согласен, что пользы от этого не много, практичнее использовать ссылку.
Термин «Интеллектуальный указатель» (smart pointer) используется в переводах книг по С++ издательств «И.Д. Вильямс», «Диалектика». Именно они перевели и издали самые известные работы Скотта Мейерса, Герба Саттера и других гуру С++ (например [Meyers2]). Я как-то привык именно к этому варианту.
Можно и нужно для шаблонной машинерии, чтобы например сказать шаблону вот такой тип у функции, ты для неё код вызова сгенерируй.
template <const ParamCount>
using WrappedFnImplArg = Value;
template<const ParamCount ...Is>
consteval auto WrappedFnImpl(std::index_sequence<Is...>) -> Value(*)(WrappedFnImplArg<Is>...);
template <const ParamCount N>
using WrappedFn = decltype(WrappedFnImpl(std::make_index_sequence<N>()));
Спасибо, интересная статья. Надо будет что-то из этого попробовать на практике. Непрозрачный указатель вот в частности заинтриговал.
Есть еще вот такая штука
https://stackoverflow.com/questions/37744047/class-declaration-inside-function-parameter-list?utm_source=chatgpt.com
И можно например написать вот так
std::unique_ptr<class X> x_ptr;
Спасибо! Не знал про такой вариант. Думаю, для полноты надо добавить в статью раздел с описанием этой ситуации.
Добавил раздел на эту тему. Если интересно посмотрите раздел 4.7. Еще раз спасибо!
Про область видимости не совсем так.
Обратите внимание https://godbolt.org/z/YTM1Kzq8r
class X и Y объявляю внутри Foo, но X в той же области видимости что и Foo, а Y в области видимости внутри Foo.
У меня вообще какая-то чертовщина. Пример не компилируется, но компилируется такой код:
namespace F {
void g(){
std::unique_ptr ptry;
Y* y = new Y();
ptry.reset(y);
}
Y y;
}
Класс Y нигде не определен. То есть компилятор сгенерировал некий пустой класс Y в namespace F. У меня компилятор MSVC. Про шаблоны уберу.
Про шаблоны уберу.
https://godbolt.org/z/Eh53TGc5e это и аргументами функции работает
Спасибо! С параметрами функций, возвращаемом значении функции, а также с объявлениями переменных и псевдонимов все в порядке, это я не трогал. Но вот неполные объявления аргументы шаблона удалил, в моем компиляторе MSVC это не работает, скорее всего ошибка компилятора, возможно в других компиляторах работает, но я не проверял.
https://godbolt.org/z/Mb57YsMjc странно. Тут работает.
IMHO, если между двумя классами циклические зависимости, то что-то не так с этими классами и надо думать, как их переделать, а не городить неполные объявления.
Использование неполных объявлений в C++