Как стать автором
Обновить

Комментарии 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>()));

Спасибо! Разберусь чуть попозже.

Спасибо, интересная статья. Надо будет что-то из этого попробовать на практике. Непрозрачный указатель вот в частности заинтриговал.

Спасибо! Не знал про такой вариант. Думаю, для полноты надо добавить в статью раздел с описанием этой ситуации.

Сам когда-то увидел в каком-то виде с cppcon. Не мог найти примеры и как это называется. Пришлось чатгпт мучать.

Добавил раздел на эту тему. Если интересно посмотрите раздел 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 это не работает, скорее всего ошибка компилятора, возможно в других компиляторах работает, но я не проверял.

Нашел ошибку в своих тестах. Теперь все примеры компилируются. Подправил статью, раздел 4.7. Еще раз спасибо.

IMHO, если между двумя классами циклические зависимости, то что-то не так с этими классами и надо думать, как их переделать, а не городить неполные объявления.

В принципе согласен. Но программист должен знать разные способы решения проблемы и выбрать подходящий в конкретной ситуации.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации