CXX95 Telegram 18
#advice

В любой непонятной ситуации делай шаблон

Это совет от Капитана Очевидности. Нередко в разных проектах встречаются две проблемы, которые решаются одним способом.

Пусть у нас есть метод, который принимает...

(1) Очень длинный тип, который вручную пишут полностью или через typedef.
using TBazArray = ::google::protobuf::RepeatedPtrField<Namespace::Foo::Bar::Baz>;
bool AllShallFall(const TBazArray& bazArray) { ... };

Совет - надо просто заиспользовать шаблон, тогда не придется выискивать по репозиторию, какой же тип надо точно вписать.
template<typename T>
bool AllShallFall(const T& bazArray) { ... };


(2) Передача лямбды в функцию. Вряд ли кто-то передает их как "ссылку на функцию" (а я их без Интернета не напишу), поэтому могут заиспользовать std::function. Он плох тем, что аллоцирует память в стеке, и вообще лишнее звено.
bool AllShallFall(std::function<int(void)> callback) { ... };
// ...
AllShallFall([]() { return 4; });

Совет - можно избавиться от лишнего звена и передавать "напрямую", а компилятор даже сможет заинлайнить и оптимизировать код
template<typename T> AllShallFall(T callback) { ... };
// ...
AllShallFall([]() { return 4; });

Нужно быть осторожным, если не хотите копирования больших объектов. Лямбды это объекты closure type, размер в байтах которого зависит от размера за-capture-нных данных (ссылка/указатель - 8 байт, объекты по значению - их sizeof). В примере выше именно копирование объекта closure type, хотя на это забиваем из-за того что размер 0 байт (ничего не capture-им).

Поэтому код выше можно сломать, если сделать capture некопируемого объекта
std::unique_ptr i = std::make_unique<int>(3);
auto l = [i = std::move(i)]() { return 4; };
AllShallFall(l);


Чтобы оптимизировать передачу лямбды в любых условиях, можно использовать универсальные ссылки
template<typename T> AllShallFall(T&& callback) { ... };



tgoop.com/cxx95/18
Create:
Last Update:

#advice

В любой непонятной ситуации делай шаблон

Это совет от Капитана Очевидности. Нередко в разных проектах встречаются две проблемы, которые решаются одним способом.

Пусть у нас есть метод, который принимает...

(1) Очень длинный тип, который вручную пишут полностью или через typedef.

using TBazArray = ::google::protobuf::RepeatedPtrField<Namespace::Foo::Bar::Baz>;
bool AllShallFall(const TBazArray& bazArray) { ... };

Совет - надо просто заиспользовать шаблон, тогда не придется выискивать по репозиторию, какой же тип надо точно вписать.
template<typename T>
bool AllShallFall(const T& bazArray) { ... };


(2) Передача лямбды в функцию. Вряд ли кто-то передает их как "ссылку на функцию" (а я их без Интернета не напишу), поэтому могут заиспользовать std::function. Он плох тем, что аллоцирует память в стеке, и вообще лишнее звено.
bool AllShallFall(std::function<int(void)> callback) { ... };
// ...
AllShallFall([]() { return 4; });

Совет - можно избавиться от лишнего звена и передавать "напрямую", а компилятор даже сможет заинлайнить и оптимизировать код
template<typename T> AllShallFall(T callback) { ... };
// ...
AllShallFall([]() { return 4; });

Нужно быть осторожным, если не хотите копирования больших объектов. Лямбды это объекты closure type, размер в байтах которого зависит от размера за-capture-нных данных (ссылка/указатель - 8 байт, объекты по значению - их sizeof). В примере выше именно копирование объекта closure type, хотя на это забиваем из-за того что размер 0 байт (ничего не capture-им).

Поэтому код выше можно сломать, если сделать capture некопируемого объекта
std::unique_ptr i = std::make_unique<int>(3);
auto l = [i = std::move(i)]() { return 4; };
AllShallFall(l);


Чтобы оптимизировать передачу лямбды в любых условиях, можно использовать универсальные ссылки
template<typename T> AllShallFall(T&& callback) { ... };

BY C++95


Share with your friend now:
tgoop.com/cxx95/18

View MORE
Open in Telegram


Telegram News

Date: |

With the “Bear Market Screaming Therapy Group,” we’ve now transcended language. How to create a business channel on Telegram? (Tutorial) The administrator of a telegram group, "Suck Channel," was sentenced to six years and six months in prison for seven counts of incitement yesterday. Informative Find your optimal posting schedule and stick to it. The peak posting times include 8 am, 6 pm, and 8 pm on social media. Try to publish serious stuff in the morning and leave less demanding content later in the day.
from us


Telegram C++95
FROM American