Book Image

Hands-On Design Patterns with C++

By : Fedor G. Pikus
Book Image

Hands-On Design Patterns with C++

By: Fedor G. Pikus

Overview of this book

C++ is a general-purpose programming language designed with the goals of efficiency, performance, and flexibility in mind. Design patterns are commonly accepted solutions to well-recognized design problems. In essence, they are a library of reusable components, only for software architecture, and not for a concrete implementation. The focus of this book is on the design patterns that naturally lend themselves to the needs of a C++ programmer, and on the patterns that uniquely benefit from the features of C++, in particular, the generic programming. Armed with the knowledge of these patterns, you will spend less time searching for a solution to a common problem and be familiar with the solutions developed from experience, as well as their advantages and drawbacks. The other use of design patterns is as a concise and an efficient way to communicate. A pattern is a familiar and instantly recognizable solution to specific problem; through its use, sometimes with a single line of code, we can convey a considerable amount of information. The code conveys: "This is the problem we are facing, these are additional considerations that are most important in our case; hence, the following well-known solution was chosen." By the end of this book, you will have gained a comprehensive understanding of design patterns to create robust, reusable, and maintainable code.
Table of Contents (21 chapters)

Type-erased ScopeGuard

If you search online for a ScopeGuard example, you may chance upon an implementation that uses std::function instead of a class template. The implementation itself is quite simple:

class ScopeGuard {
public:
template <typename Func> ScopeGuard(Func&& func)
: commit_(false), func_(func) {}
template <typename Func> ScopeGuard(const Func& func)
: commit_(false), func_(func) {}
~ScopeGuard() { if (!commit_) func_(); }
void commit() const noexcept { commit_ = true; }
ScopeGuard(ScopeGuard&& other)
: commit_(other.commit_),
func_(other.func_)
{ other.commit(); }
private:
mutable bool commit_;
std::function<void()> func_;
ScopeGuard& operator=(const ScopeGuard&) = delete;
};

Note that this ScopeGuard is a class, not a class template. It has template...