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: |

The administrator of a telegram group, "Suck Channel," was sentenced to six years and six months in prison for seven counts of incitement yesterday. A Telegram channel is used for various purposes, from sharing helpful content to implementing a business strategy. In addition, you can use your channel to build and improve your company image, boost your sales, make profits, enhance customer loyalty, and more. How to Create a Private or Public Channel on Telegram? How to Create a Private or Public Channel on Telegram? Other crimes that the SUCK Channel incited under Ng’s watch included using corrosive chemicals to make explosives and causing grievous bodily harm with intent. The court also found Ng responsible for calling on people to assist protesters who clashed violently with police at several universities in November 2019.
from us


Telegram C++95
FROM American