Size: a a a

2020 August 11

ПК

Побитый Кирпич... in supapro.cxx
Vladimir Suisei
А какой будет эффект если я напишу в cpp а потом попытаюсь заюзать в другом cpp
Это ты ещё должен декларацию шаблона в другой cpp прокинуть через хэдер всё равно
источник

ПК

Побитый Кирпич... in supapro.cxx
Vladimir Suisei
Если я обязан весь внутренний код в хедере писать
namespace detail
источник

ПК

Побитый Кирпич... in supapro.cxx
или impl
источник

AP

Alexander Potapov in supapro.cxx
Vladimir Suisei
А как тогда инкапсулировать и скрывать реализацию, например в библиотеке
ты можешь создать другой файл и написать туда реализацию, а потом подключить его в хедер . Но все равно в темплейтах тебе придётся экспозить код юзеру
источник

VS

Vladimir Suisei in supapro.cxx
Не понял как использовать тут неймспейсы
источник

AP

Alexander Potapov in supapro.cxx
Типо темплейт форвардит все в другой темплейт, который в неймспейсе
источник

ПК

Побитый Кирпич... in supapro.cxx
Vladimir Suisei
Не понял как использовать тут неймспейсы
Пишешь приватный интерфейс в namespace detail
источник

VS

Vladimir Suisei in supapro.cxx
А можно пример?)
источник

ПК

Побитый Кирпич... in supapro.cxx
Vladimir Suisei
А можно пример?)
namespace my_lib {
 namespace detail {
   template <typename T> void bar() {}
   template <typename T> void baz() {}
 }
 template <typename T>
 void foo() { detail::bar<T>(); detail::baz<T>(); }
}
источник

AP

Alexander Potapov in supapro.cxx
Vladimir Suisei
Есть еще какая-то дичь  с std::forward и шаблонами
Если твой метод должен принимать объекты как по значению, так и по ссылке и rvalue ссылке, а потом передавать куда-то дальше, то пишут так:
template<typename T>
void foo(T&& t) {
   bar(std::forward<T>(t));
}
тем самым bar получить объект в том же виде, в котором он был передан в foo
источник

VS

Vladimir Suisei in supapro.cxx
Alexander Potapov
Если твой метод должен принимать объекты как по значению, так и по ссылке и rvalue ссылке, а потом передавать куда-то дальше, то пишут так:
template<typename T>
void foo(T&& t) {
   bar(std::forward<T>(t));
}
тем самым bar получить объект в том же виде, в котором он был передан в foo
Ок, мне это пока не надо
источник

ПК

Побитый Кирпич... in supapro.cxx
Alexander Potapov
Если твой метод должен принимать объекты как по значению, так и по ссылке и rvalue ссылке, а потом передавать куда-то дальше, то пишут так:
template<typename T>
void foo(T&& t) {
   bar(std::forward<T>(t));
}
тем самым bar получить объект в том же виде, в котором он был передан в foo
> принимать объекты как по значению

По значению так никак не принять
источник

AP

Alexander Potapov in supapro.cxx
да, мой косяк
источник

VS

Vladimir Suisei in supapro.cxx
Побитый Кирпич
namespace my_lib {
 namespace detail {
   template <typename T> void bar() {}
   template <typename T> void baz() {}
 }
 template <typename T>
 void foo() { detail::bar<T>(); detail::baz<T>(); }
}
Ну так все равно же в хедере все будет
источник

ПК

Побитый Кирпич... in supapro.cxx
Vladimir Suisei
Ну так все равно же в хедере все будет
И что?
источник

ПК

Побитый Кирпич... in supapro.cxx
Можешь в другой header вынести и заинклудить его тут
источник

ПК

Побитый Кирпич... in supapro.cxx
Это в данном случае неважно
источник

AP

Alexander Potapov in supapro.cxx
Vladimir Suisei
Ну так все равно же в хедере все будет
Смотри, такой вопрос: cpp файл компилятор превращает в объектник с асмом. Какой асм должен генерировать компилятор для темплейтов?
источник

VS

Vladimir Suisei in supapro.cxx
Я не понимаю почему нельзя сделать так чтобы писал в cpp и все работало
источник

AP

Alexander Potapov in supapro.cxx
Ответь на вопрос выше
источник