- Design principles
- Safety and security
- Working with existing code and legacy systems
- Overview of patterns and idioms
- Creational patterns
- Structural patterns
- Behavioural patterns
- Miscellaneous patterns
- Metaprogramming patterns
- Lambda expression idioms
- Concurrency patterns
- Functional programming patterns
- Antipatterns
🔗
- A.O’Dwyer. Remember the
ifstream
(2018) - Hyrum’s law
❔
- What is a magic number, and why is it bad? – Stack Overflow
- Are global variables bad? – Stack Overflow
🎥
- S.Parent. Better code: Relationships – CppCon (2019)
- F.Pikus. Design for performance – CppCon (2018)
📖
- The architecture of open source applications
- Holub A.I. Enough rope to shoot yourself in the foot (1995)
⚓
- B.Stroustrup. Remember the Vasa! – WG21/P0977
🔗
- Google C++ style guide
- D.Kieras. C++ header file guidelines
- A.O’Dwyer. Prefer core-language features over library facilities (2022)
- M.Wilson. QM bites: The two sides of boolean parameters – Overload 130 (2015)
- S.Ignatchenko. Best practices vs witch hunts – Overload 125 (2015)
- B.Schmidt. I like whitespace – Overload 125 (2015)
- J.Wakely. Stop the constant shouting – Overload 121 (2014)
❔
- Does
auto
make C++ code harder to understand? – Software Engineering
🎥
- B.Dechrai. Clean code: Be the hero – NDC Oslo (2023)
- N.Josuttis. When C++ style guides contradict – CppCon (2019)
- M.Price. A critical look at the coding standards landscape – CppCon (2019)
- M.Wong. Writing safety critical automotive software for high perf AI hardware – CppCon (2019)
- K.Gregory. 10 core guidelines you need to start using now – CppCon (2017)
- B.Stroustrup. Writing good C++14 – CppCon (2015)
- H.Sutter. Back to the basics! Essentials of modern C++ style – CppCon (2014)
⚓
🔗
- J.Dennett, and J.Rennie. TotW #186: Prefer to put functions in the unnamed namespace` – Abseil C++ Tips
- M.Wilson. QM bites: Order your includes (twice over) – Overload 133 (2016)
🔗
- R.Chen. API naming principles for conditional operations:
On
,When
, andIf
(2024) - K.Henney. Exceptional naming (2021)
- J.Müller. Technique: Recursive variants and boxes (2019)
- T.Köppe. TotW #119: Using-declarations and namespace aliases` – Abseil C++ Tips
- T.Winters. TotW #130: Namespace naming` – Abseil C++ Tips
🎥
- A.O’Dwyer. When should you give two things the same name? – C++Now (2021)
- K.Gregory. Naming is hard: Let’s do better – CppCon (2019)
⚓
- V.Reverdy. On the names of low-level bit manipulation functions – WG21/P1956
🔗
- T.Winters. TotW #88: *Initialization:
=
,()
, and{}*
– Abseil C++ Tips
🎥
- J.Kalb. This is why we can’t have nice things – CppCon (2018)
🔗
- K.Henney. Comment only what the code cannot say (2020)
- K.Henney. Comment only what the code cannot say – Overload 157 (2020)
- J.Atwood. Coding without comments (2008)
🎥
- W.E.Brown. Whitespace <= comments << code – CppCon (2017)
🔗
- R.C.Martin. Design principles and design patterns
- R.C.Martin. SOLID: Single responsibility principle, Open-closed principle, Interface segregation principle, Dependency inversion principle
- L.R.Teodorescu. Deconstructing inheritance – Overload 156 (2020)
- C.Oldwood. KISSing SOLID goodbye – Overload 122 (2014)
- R.C.Martin. The principles of OOD – Uncle Bob (2004)
- H.Sutter. What’s in a class? The interface principle (1998)
🎥
- T.Van Eerd. Keynote: SOLID, revisited – C++Now (2021)
- J.Kalb. Back to basics: Object-oriented programming – CppCon (2018)
- S.Parent. Inheritance is the base class of evil – GoingNative (2013)
- K.Henney. The SOLID design principles deconstructed – YOW! (2013)
📖
- Sec.: Class design and inheritance – H.Sutter, A.Alexandrescu. C++ coding standards: 101 rules, guidelines, and best practices – Addison-Wesley (2004)
⚓
- SOLID – Wikipedia
Liskov substitution principle states that, in a computer program, if
S
is a subtype ofT
, then objects of typeT
may be replaced with objects of typeS
(i.e. an object of typeT
may be substituted with any object of a subtypeS
) without altering any of the desirable properties of the program (correctness, task performed, etc.).
🔗
- Liskov substitution principle – Wikipedia
- R.C.Martin. Liskov substitution principle
❔
- What is an example of the Liskov substitution principle? – Stack Overflow
The interface segregation principle states that no client should be forced to depend on methods it does not use.
🎥
- S.Nikolov. OOP is dead, long live data-oriented design – CppCon (2018)
🔗
- J.Müller.
malloc()
andfree()
are a bad API (2022) - J.Müller.
saturating_add
vs.saturating_int
– new function vs. new type? (2022) - A.Mertz.
isValid()
? Establish invariants and avoid zombie objects (2021) - A.O’Dwyer. A very short war story on too much overloading (2020)
- A.O’Dwyer.
const
is a contract (2019) - A.O’Dwyer. Pointer to raw memory?
T*
. (2018) - S.Meyers. How non-member functions improve encapsulation – C/C++ Users Journal 18 (2000)
- S.Meyers. Signed and unsigned types in interfaces – C++ Report (1995)
🎥
- B.Fahller. Typical C++, but why? – C++ Meeting (2023)
- J.Pavan. API design principles in C++ – CppNorth (2023)
- A.Weis. How to build C++ interfaces that are hard to use incorrectly – C++ on Sea (2023)
- K.Iglberger. Back to basics: Designing classes, part II – CppCon (2021)
- M.Godbolt. Correct by construction: APIs that are easy to use and hard to misuse – C++ on Sea (2020)
- K.Iglberger. Free your functions! – CppCon (2017)
🔗
- S.Dargo. Use strong types instead of
bool
parameters (2022) - J.Mitchell. Pass-by-value vs pass-by-reference (2022)
- S.Collyer. Replacing
bool
values – Overload 163 (2021)
❔
- Pass by value vs pass by rvalue reference – Stack Overflow
- Is it better to pass by value or pass by constant reference? – Stack Overflow
⚓
- F.16: For “in” parameters, pass cheaply-copied types by value and others by reference to
const
– C++ core guidelines
:link
- S.Parent. Stop using out arguments (2018)
- M.Clow. Fixing an interface bug (2013)
❔
- Purpose of returning by
const
value? – Stack Overflow
🔗
- A.Krzemieński. Destructors that throw (2011)
- B.Kolpackov. Throwing destructors (2004)
❔
- Throwing exceptions out of a destructor – Stack Overflow
🎥
- P.Isensee. Destructor case studies: Best practices for safe and efficient teardown – CppCon (2019)
See also Rvalue references, universal references, and move semantics – Core language.
:link
- J.Müller. Move safety – Know what can be done in the moved-from state (2016)
The rule of zero: if a class requires no user-defined constructors, no user-defined assignment operators and no user-defined destructor, avoid defining them. The rule of three/five: if a class requires a user-defined destructor, a user-defined copy (and move) constructor, or a user-defined copy (and move) assignment operator, it almost certainly requires all three (five).
🔗
- Rule of three – Wikipedia
- S.Meyers. A concern about the rule of zero (2014)
- J.Alday. Enforcing the rule of zero – Overload 120 (2014)
- R.M.Fernandes. Rule of zero (2012)
⚓
- The rule of three/five/zero – C++ reference
- W.E.Brown. Proposing the rule of five, v2 – WG21/N3839 (2014)
🔗
- A.Krzemieński. Contracts, preconditions & invariants (2020)
🎥
- A.Krzemieński. Preconditions, postconditions, invariants: How they help write robust programs – C++Now (2021)
🔗
- J.Müller. Exceptions vs expected: Let’s find a compromise (2017)
- J.Müller. How to handle errors in constructors without exceptions? (2017)
- V.Romeo. Why choose sum types over exceptions? (2017)
🎥
- W.E.Brown. Communicating via diagnostics: Observations and tips for authors – CppCon (2018)
- A.Schödl. *A practical approach to error handling – Meeting C++ (2014)
⚓
- L.Crowl. Handling disappointment in C++ – WG21/P0157R0 (2015)
⚓
- Error handling – C++ reference
See also Exceptions – Core language and Exceptions – The standard library and proposals.
Levels of exception guarantee:
- nothrow exception guarantee: the function never throws exceptions;
- strong exception guarantee: if the function throws an exception, the state of the program is rolled back to the state just before the function call (commit-or-rollback semantics);
- basic exception guarantee: if the function throws an exception, the program is in a valid state, no resources are leaked, and all objects’ invariants are intact;
- no exception guarantee: if the function throws an exception, the program may not be in a valid state, resource leaks, memory corruption, or other invariant-destroying errors may have occurred.
For exceptions in destructors, see Destructors.
🔗
- M.Clow. Simplifying code and achieving exception safety using
unique_ptr
(2015) - H.Sutter. GotW #102: Exception-safe function calls (2012)
- H.Sutter. GotW #56: Exception-safe function calls
- H.Sutter. When and how to use exceptions – Dr.Dobb’s Journal (2004)
- H.Sutter. Exception-safe generic containers (1997)
- T.Cargill. Exception handling: A false sense of security (1994)
❔
- When should I really use
noexcept
? – Stack Overflow
🎥
- P.Muldoon. Exceptionally bad: The story on the misuse of exceptions and how to do better – CppCon (2023)
- B.Saks. Back to basics: Exception handling and exception safety – CppCon (2019)
⚓
- Exceptions – C++ reference
std::move_if_noexcept
– C++ reference- A.Meredith, J.Lakos.
noexcept
prevents library validation – WG21/N3248
🔗
- K.Henney. Test precisely and concretely – Overload 161 (2021)
🎥
- P.Nash. Test driven C++ – CppCon (2020)
- B.Saks. Back to basics: Unit tests – CppCon (2020)
- D.Steffen. The science of unit tests – CppCon (2020)
- F.Pikus. Back to basics: Test-driven development – CppCon (2019)
- M.Clow. Making your library more reliable with fuzzing – C++Now (2018)
- K.Henney. Test smells and fragrances – DevWeek (2014)
A seam is a place where a program behaviour can be altered without modifying it in that place.
🔗
- M.Rüegg. Refactoring towards seams in C++ – Overload 108 (2012)
- M.Feathers. Testing effectively with legacy code (2005)
🎥
- L.Valenty. Embedded logging case study: From C to shining C++ – C++Now (2022)
- D.Saks. Writing better embedded software – Meeting C++ (2018)
🎥
- P.Sommerlad. Safer C++ with MISRA-C++-2023 – ACCU (2024)
🎥
- K.Serebryany. Memory tagging and how it improves C/C++ memory safety – CppCon (2018)
📄
- K.Serebryany, E.Stepanov, A.Shlyapnikov, V.Tsyrklevich, D.Vyukov. Memory tagging and how it improves C/C++ memory safety – Preprint (2018)
🎥
- P.Sommerlad. Simplest safe integers – C++Now (2021)
- R.Ramey. Safe Numerics – CppCon (2018)
⚓
🎥
- P.Muldoon. Redesigning legacy systems: Keys to success – C++Now (2022)
- D.Sankel. So, you inherited a large code base... – CppCon (2017)
- W.E.Brown. A medley of C++: A review of published code – C++ on Sea (2022)
A design pattern is a general technique used to solve a class of related problems.
🔗
- Design patterns – Wikipedia
- S.Ignatchenko. “No Bugs” top five C++ cooking recipes – Overload 113 (2013)
🎥
- S.Theophil. Reusable code, reusable data structures – CppCon (2024)
- С.Ryan. Design patterns: Examples in C++ – ACCU (2023)
- K.Iglberger. Back to basics: Designing classes, part I – CppCon (2021)
- F.Pikus. C++ design patterns: From C++03 to C++17 – CppCon (2019)
- D.Nesteruk. Design patterns in modern C++ – ACCU (2016)
🔗
- Creational pattern – Wikipedia
The abstract factory pattern provides an interface for creating related or dependent objects without specifying the objects’ concrete classes.
The builder pattern separates the creation of an object from its representation. It is used to create complex objects that are built in multiple stages:
struct Builder { Builder(...); Builder& add(...) { ...; return *this; } operator Product() const; }; Product pr = Builder(...).add(...).add(...).add(...);
🔗
- Builder pattern – Wikipedia
Factory method pattern allows a class to defer instantiation to subclasses.
📖
- Ch. 13: Virtual constructors and factories – F.G.Pikus. Hands-on design patterns with C++ (2019)
🔗
The singleton pattern ensures that a class has one instance and provides a global point of access to that instance. It is useful when exactly one object is needed to coordinate actions across the system.
class Singleton { public: static Singleton& instance() { static Singleton inst; return inst; } private: // protected: Singleton(); Singleton(const Singleton&) = delete; Singleton& operator=(const Singleton&) = delete; ~Singleton() = default; };
🔗
- Singleton – Wikipedia
- F.Glassborow. Exploring patterns: Part 1 – Overload 26 (1998)
- R.Nystrom. Singleton – Game programming patterns
❔
- Is Meyers’ implementation of the Singleton pattern thread safe? – Stack Overflow
📖
- Ch. 15: Singleton – A classic OOP pattern – F.G.Pikus. Hands-on design patterns with C++ (2019)
- Ch. 6: Implementing singletons – A.Alexandrescu. Modern C++ design: Generic programming and design patterns applied (2001)
- Item 26: Limiting the number of objects of a class – S.Meyers. More effective C++: 35 new ways to improve your programs and designs (1996)
🎥
- A.Weis. How to build C++ interfaces that are hard to use incorrectly – C++ on Sea (2023)
- A.Weis. Fixing two-phase initialization – CppCon (2018)
🔗
- Adapter pattern – Wikipedia
🎥
- Adapter design pattern – D.Banas
🔗
- A.Fertig. When an empty destructor is required (2023)
- A.Mertz. The pImpl idiom (2019)
❔
- Is the pImpl idiom really used in practice? – Stack Overflow
- Pimpl with smart ptr – Why constructor/destructor needed – Stack Overflow
🎥
- D.Schmidt. The composite and bridge patterns
- D.Banas. Bridge design pattern
⚓
- Bridge pattern – Wikipedia
🔗
- K.Henney. Valued conversions – C++ Report (2000)
- Type erasure – Wikibooks
🎥
- K.Iglberger. Breaking dependencies: Type erasure – The implementation details – C++ Meeting (2023)
- K.Iglberger. Breaking dependencies: Type erasure – A design analysis – CppCon (2021)
🔗
🔗
- Y.Mandelbaum. TotW #134:
make_unique
and private constructors` – Abseil C++ Tips
❔
- Is this key-oriented access-protection pattern a known idiom? – Stack Overflow
The copy-and-swap idiom allows an assignment operator to be implemented elegantly with strong exception safety. However, it is often harmful to performance when a strong exception safety guarantee of the copy assignment operator is not needed.
class Object { public: Object(const Object&); Object(Object&&); Object& operator=(const Object& obj) { Object{obj}.swap(*this); return *this; } Object& operator=(Object&& obj) { Object{std::move(obj)}.swap(*this); return *this; } };
🔗
- Copy-and-swap – WikiBooks
❔
- What is the copy-and-swap idiom? – Stack Overflow
- Using
swap
to implement move assignment – Stack Overflow
📖
- Ch. 5: A comprehensive look at RAII – F.G.Pikus. Hands-on design patterns with C++ (2019)
🔗
- K.Henney. C++ patterns: Executing around sequences – EuroPLoP (2000)
Execute-around object idiom abstracts the execution of a pair of actions that surround a sequence of statements, or a single action that follows a sequence. This idiom is also known by the name of scope guard and resource acquisition is initialization (RAII). An example of this idiom is provided by standard library smart pointers, e.g. by
std::unique_ptr
.
🔗
- Resource acquisition is initialization – Wikipedia
- E.Bendersky. C++: RAII without exceptions (2016)
- P.Grenyer. RAII is not garbage – Overload 106 (2011)
❔
- What is meant by Resource acquisition is initialization (RAII)? – Stack Overflow
🎥
- N.Josuttis. The most important C++ feature (Lightning talk) – ACCU (2023)
📖
- Ch. 5: A comprehensive look at RAII – F.G.Pikus. Hands-on design patterns with C++ (2019)
⚓
- RAII – C++ reference
Execute-around proxy idiom applies execute-around object idiom for individual calls on an object.
Execute-around pointer idiom defines an execute-around proxy idiom when the actions performed on a target object are the same for all functions.
📝
- This idiom can be used to “convert” a non-thread-safe class into a thread-safe one by automatically locking and unlocking a mutex when member functions are called.
🔗
- Execute-around pointer – WikiBooks
- We make any object thread-safe – CodeProject (2018)
Execute-around function idiom safely groups and executes a sequence of statements that must be enclosed by a pair of actions, or followed by a single action.
🔗
- Duff’s device – Wikipedia
- T.Duff. Tom Duff on Duff’s device (1988)
🔗
- M.Weisfeld. An alternative to large
switch
statements – C/C++ Users Journal 12 (1994)
The chain-of-responsibility is a design pattern consisting of a source of command objects and a series of processing objects. Each processing object contains logic that defines the types of command objects that it can handle; the rest are passed to the next processing object in the chain.
🔗
- Chain-of-responsibility pattern – Wikipedia
The strategy pattern enables run- or compile-time selection of an algorithm for a particular behaviour. This pattern is also known by the name of policy pattern.
🎥
- H.Matthews. The C++ type system is your friend – ACCU (2017)
📖
- Ch. 16: Policy-based design – F.G.Pikus. Hands-on design patterns with C++ (2019)
- Ch. 1: Policy-based class design – A.Alexandrescu. Modern C++ design: Generic programming and design patterns applied – Addison-Wesley (2001)
Dependency injection is a design pattern in which an object or function receives other objects or functions that it depends on. It aims to separate the concerns of constructing objects and using them, leading to loosely coupled programs.
🎥
- F.Zoffoli. How to use C++ dependency injection to write maintainable software – CppCon (2022)
❔
⚓
- Dependency injection – Wikipedia
The visitor pattern separates an algorithm from an object structure, which is the data for this algorithm. It lets one define a new operation without changing the classes of the elements on which it operates.
class Visitor { public: void visit(A&); void visit(B&); }; class A { public: void accept(Visitor& v) { v.visit(*this); } }; class B { public: void accept(Visitor& v) { v.visit(*this); } };
🔗
- Visitor pattern – Wikipedia
- F.Glassborow. Exploring patterns: Part 2 – Overload 27 (1998)
❔
- When should I use the Visitor design pattern? – Stack Overflow
🎥
- B.Kannan. Generalised double dispatch – CppCon (2019)
See also Iterators – The standard library and proposals.
🔗
- J.M.Curran. Creating a word iterator – C/C++ Users Journal 16 (1998)
A transform iterator adapts an iterator by modifying the dereference operator to apply a function object to the result of dereferencing the iterator and returning the result.
🔗
- T.Becker. Smart iterators and STL – C/C++ Users Journal 16 (1998)
⚓
- Transform iterator – Boost.Iterator
🔗
- A.O’Dwyer. *Pitfalls and decision points in implementing
const_iterator
(2018)
🔗
- J.Müller. Tutorial: C++20’s iterator sentinels (2020)
- Ch. 14: The template method pattern and the non-virtual idiom – F.G.Pikus. Hands-on design patterns with C++ (2019)
🎥
- A.Weis. How to build C++ interfaces that are hard to use incorrectly – C++ on Sea (2023)
The "address of" trick is used to find the address of an object of a class that has an overloaded unary
operator&
.
🔗
Address of – WikiBooks
⚓
- std::addressof – C++ reference
❔
- How do I remove code duplication between similar
const
and non-const
member functions? – Stack Overflow
An opaque type is a new type that is distinct from and distinguishable from its underlying type, yet retaining layout compatibility with its underlying type. The intent is to allow programmer control (1) over substitutability between an opaque alias and its underlying type, and (2) over overloading based on any parameter whose type is or involves an opaque alias.
template<class T> class Whole_value { public: Whole_value(T v) : v_(v) {} operator T() const { return v_; } private: T v_; };
🔗
- A.Fertig. A strongly typed
bool
(2023) - L.Böger. Empty scoped enums as strong aliases for integral types – Overload 152 (2019)
- J.Müller. Tutorial: Emulating strong/opaque typedefs in C++ (2016)
- A.Williams.
jss::strong_typedef
library - P.Sommerlad.
PSsst
library - M.Moene. Whole value idiom
🎥
- A.Williams. Library approaches for strong type aliases – C++Now (2021)
- H.Matthews. The C++ type system is your friend – ACCU (2017)
⚓
- W.E.Brown. Toward opaque typedefs for C++1Y, v2 – WG21/N3741 (2013)
BOOST_STRONG_TYPEDEF
– Boost.Serialization
for (;;) { ... } while (true) { ... } do { ... } while (true);
See also Infinite loops – Hardware, optimization, and OS internals.
🔗
- M.Wilson. QM bites: Looping for-ever – Overload 132 (2016)
❔
- Endless loop in C/C++ – Stack Overflow
❔
- Why cast unused return values to
void
? – Stack Overflow - What does casting to
void
really do? – Stack Overflow - Is it ok to use
std::ignore
in order to discard a return value of a function to avoid any related compiler warnings? – Stack Overflow
🔗
- Y.Wu. Compile-time strings – Overload 172 (2022)
🔗
❔
- What are customization point objects and how to use them? – Stack Overflow
- What is a niebloid? – Stack Overflow
⚓
- Customization point object – C++ reference
The curiously recurring template pattern (CRTP) is an idiom in which a class
X
derives from a class template usingX
itself as template parameter:template<class Derived> class Base { private: friend Derived; Base(); public: void foo() { static_cast<Derived*>(this)->foo(); } }; class X : public Base<X> { public: void foo(); }
🔗
- Curiously recurring template pattern – Wikipedia
- Curiously recurring template pattern – Wikibooks
- J.Müller. Tutorial: The CRTP interface technique (2021)
- A.Nasonov. Better encapsulation for the curiously recurring template pattern – Overload 70 (2005)
- J.Coplien. Curiously recurring template patterns – C++ Report (1995)
❔
- What is the curiously recurring template pattern? – Stack Overflow
- CRTP with protected derived member – Stack Overflow
📖
- Ch. 8: The curiously recurring template pattern – F.G.Pikus. Hands-on design patterns with C++ (2019)
- J.O.Coplien. Curiously recurring template patterns – S.B.Lippman. C++ gems: Programming pearls from The C++ report (1997)
📖
- T.Veldhuizen. Expression templates – S.B.Lippman. C++ gems: Programming pearls from The C++ report (1997)
🔗
- Barton–Nackman trick – Wikipedia
- Barton–Nackman trick – WikiBooks
📖
- Sec. 21.2.1: The Barton–Nackman trick – D.Vandevoorde, N.M.Josuttis, D.Gregor. C++ templates: The complete guide (2017)
🔗
- D.Reichard. Shim classes – C/C++ Users Journal 18 (2000)
🔗
- Int-to-type – Wikibooks
❔
- Why does Boost MPL have integral constants? – Stack Overflow
📖
- Sec. 2.4: Mapping integral constants to types – A.Alexandrescu. Modern C++ design: Generic programming and design patterns applied (2001)
⚓
std::integral_constant
– C++ reference
See also Lambda expressions – Core language.
🎥
- T.Doumler. C++ lambda idioms – CppCon (2022)
const auto value = []{ return /* complex code */; }();
const auto value = std::invoke([]{ return /* complex code */; });
🔗
⚓
- Immediately invoked function expression – Wikipedia
- Use lambdas for complex initialization, especially of
const
variables – C++ FAQ
template<class... Ts>
struct overloaded : Ts... {
using Ts::operator()...;
};
template<class... Ts>
overloaded(Ts...) -> overloaded<Ts...>;
🔗
- A.Fertig. Visiting a
std::variant
safely (2023)
⚓
std::visit
example – C++ reference
🔗
- P.Melendez. Recursive lambdas in C++(14) (2015)
❔
- Recursive lambda functions in C++11 – Stack Overflow
🎥
- R.Grimm. Concurrency Patterns – Meeting C++ (2023)
See also Multithreading – Concurrency and parallelism.
🔗
- Double-checked locking – Wikipedia
🎥
- F.Pikus. Live lock-free or deadlock (practical lock-free programming). Part I – CppCon (2015)
🎥
- V.Ciura. Functional programming in modern C++: The imperatives must go! – HE71NqRpvTQ (2023)
- R.Feldman. Why isn’t functional programming the norm? – ClojuTRE (2019)
- S.Wlaschin. Functional design patterns – NDC Sydney (2017)
See also Monads – Functional programming – General reviews and interviews.
🎥
- G.Koyrushki, A.Fisher. Monads in modern C++ – CppCon (2023)
🔗
- A.O’Dwyer. The “array size constant” antipattern (2020)
- J.Wakely. C++ antipatterns – Overload 134 (2016)
- R.B.Doe. How to leak memory in C++ – C/C++ Users Journal 15 (1997)
🎥
- A.Mertz. Identifying common code smells – C++ on Sea (2022)
- J.Turner. C++ code smells – code::dive (2019)
- J.Turner. C++ code smells – CppCon (2019)
- P.Roy. Some programming myths revisited – CppCon (2019)
- L.Brandy. Curiously recurring C++ bugs at Facebook – CppCon (2017)
- V.Ciura. 10 things junior C++ devs don’t get – CppCon (2017)
- B.Kernighan. Elements of programming style – Princeton University (2009)
📖
- A.Koenig. How to write buggy programs – S.B.Lippman. C++ gems: Programming pearls from The C++ report (1997)
📄
- E.W.Dijkstra. A case against the Go To statement, Go To statement considered harmful – EWD215 (1968)
🔗
- A.Mertz. Algorithms and the KISS principle (2019)
🎥