Simplify C++!
Write clean and maintainable C++
C++Software / engineering practiceDev tools / editors / IDEs
- Posts
- 202 from 4 Jan 2015 to 24 May 2024
- Posting
- quiet since 2024
- Kind
- personal blog
- Feed
- https://arne-mertz.de/feed/
2024 2
2021 11
- [fix dev diary] Week 6-7: Description and Issue ID
- isValid()? Establish invariants and avoid zombie objects
- [fix dev diary] Week 5: std::expected
- [fix dev diary] Week 4: Closing in on core domain code
- [fix dev diary] Week 3: create command and application service
- [fix dev diary] Week 2: Foundation of the CLI App
- [fix dev diary] Week 1: Preparations
- Old new Project: Fix
- Docker4c: portable C++ development environment
- Rebooting the blog
- Colony – A brief history of timing
2019 8
2018 37
- Simple data structures
- std::string is not a Container for Raw Data
- C++ Quizzes and Trick Questions – Do we Have to Know the Answers?
- Calling C Code from C++ With ‘extern “C”‘
- std::make_shared vs. the Normal std::shared_ptr Constructor
- Same, same, but different: when different values compare equal
- Modern C++ Features – Quality-of-Life Features
- “Modern C++” != “New(est) Standard”
- In the name of Elegance
- CMake – Properties and Options
- Reproducible build: environments and scripts
- Functions of Variants are Covariant
- “Builds on my machine!” – About local build
- CMake Project Structure
- Modern C++ Features – std::optional
- CMake – Another Target and the Project
- Hello CMake!
- Overload: Build a Variant Visitor on the Fly
- Modern C++ Features – std::variant and std::visit
- Trailing Return Types, East Const, and Code Style Consistency
- ACCUConf 2018 Trip Report
- How to Perform Unit Testing Native C++ Code in Visual Studio
- Tailor Standard Containers to Your Needs
- Raw Pointers Are Gonna Stay!
- Raw Pointers Are Gone!
- The Dark Side of Error Logging
- Code of Conduct – why I Insist
- Forward-declaring Templates and Enums
- Forward Declarations to Reduce Compiletime Dependencies
- #include – Don’t get fancy
- Terseness: how little is too much?
- Complexity Theory, Relativity and The Theory of Everything
- Design Patterns in Real Life
- Clean Code Generation
- Code Reviews – The Human Aspect (Part 5)
- Code Reviews – How? (Part 4)
- Code Reviews – Preparation (Part 3)
2017 30
- Code Reviews – What? (Part 2)
- Code Reviews – Why? (Part 1)
- Meeting C++ 2017 Trip Report
- Mutable
- Refactoring Support in Cevelop
- Code Smells – a Short List
- Approaching an Unknown Code Base
- Taking Notes About Work in Progress
- Generated Code
- Source File Organization for C++ Projects Part 3: Dependent Repositories and Generated Code
- What’s Ubiquitous Language and Why You Should Care
- reinterpret_cast vs. constant expression
- Basic Refactoring Steps
- Modern C++ Features – Class Template Argument Deduction
- C++ Online Compilers
- Continuous integration with Travis CI
- Final Classes
- Dialing back
- Smelly std::pair and std::tuple
- Prefixed Names
- Constexpr Additions in C++17
- Implementing Array Access for Tuple
- Emerging Patterns – Refactoring Session #4
- Lambda Overdose
- Refactoring Basics
- Implementation-Inspired Tests
- Modern C++ Features – decltype and std::declval
- Refactoring Session #3 – from JSON to a Proper Class.
- Ranges: the STL to the Next Level
- “YAY, Two Years!” and Guest Posts
2016 52
- Modern C++ Features – Attributes
- Return early and clearly
- BDD for C++ Projects – With Python and Behave
- Weakly Typed Data
- Trailing return types everywhere
- Prototypes: to test or not to test, that’s the question
- More About Variadic Templates
- Modern C++ Features – Variadic Templates
- Use Stronger Types!
- Modern C++ Features – User-Defined Literals
- Passkey Idiom: More Useful Empty Classes
- Tag Dispatch: Useful Empty Classes
- Large C++ Legacy Applications: Tools
- Large Legacy Applications: Tests and Modularization
- Large C++ Legacy Applications: Planned Refactoring
- Clean up Large C++ Legacy Applications
- Starting With the Poco Libraries
- Design for Testability: Separate I/O layers
- Does Const Imply Thread Safety?
- Using Conan for Third Party Libraries
- The “4C” Development Environment
- New Project: Fix – Why, What and How
- Const Correctness
- Refactoring – Don’t get Carried Away
- Refactoring Session #2b: Matrix Calculation – Extract Class
- Refactoring Session #2a: Matrix Calculation – Code Smells
- Source File Organization for C++ Projects Part 2: Directories and Namespaces
- Source File Organization for C++ Projects Part 1: Headers and Sources
- Modern C++ Features – constexpr
- Compile Time Constants Part 2: Compile Time Calculations
- Compile Time Constants Part 1: Why We Need Them
- Clean Documentation
- RAII versus Exceptions
- Development Environment: Make the Setup Simple
- Covariance with Smart Pointers
- Visitor Pattern Part 2 – the enum based visitor
- Visitor Pattern Part 1- the Object Oriented Way
- Enum vs. Class Hierarchies
- Strings vs. Enumerators
- Refactoring Session #1: Statements, Lists and Inheritance
- More About Adopting Scripting Languages
- Scripting Languages and C++
- Do Domain Specific Languages add Complexity to Plain C++?
- Use a static analyzer or two
- Compiler Warnings Part 2 – Tune the Compiler
- Compiler Warnings Part 1 – Treat Them Right
- Modern C++ features – in-place construction
- Get rid of those cheat sheets!
- Constructor Failures
- Avoid Invalid State
- C++ Object Lifetimes
- Modern C++ Features – keyword `noexcept`
2015 62
- Levels of Exception Safety
- Modern C++ Features – nullptr
- Modern C++ Features – override and final
- shared_ptr Versus unique_ptr in Factory Functions
- Don’t Believe What They Say
- Who are we Writing Code for?
- Clean up the Build
- Lambdas Part 2: Capture Lists and Stateful Closures
- Modern C++ features – lambdas
- Testing as a Developer
- rvalue References Wrap Up
- Modern C++ Features – templated rvalue References and std::forward
- Managing Object Ownership
- Modern C++ Features – Rvalue References
- Modern C++ Features – Move Constructor and Move Assignment
- Modern C++ Features – Move Semantics
- Modern C++ Features – auto for Functions
- Encapsulating APIs
- Modern C++ Features – Inherited and Delegating Constructors
- Modern C++ Features – Default Initializers for Member Variables
- Unit Tests are not Friends
- C++ is not an object oriented language
- Modern C++ Features – std::begin/end and range based for loops
- Modern C++ Features – auto for variables
- Modern C++ Features – Uniform Initialization and initializer_list
- Half a year of blogging
- The State of C++ – Is it Back or Not?
- Passing containers as out-parameters
- Domain Specific Languages in C++ – Part 2: External DSLs
- Domain Specific Languages in C++ – Part 1: Embedded DSLs
- Everything In A Class? – C++ Is Not Java!
- Properties of Unit Tests
- Purposes of Unit Tests
- Comments Mean Failure
- The Perfect Code
- Evolving a Framework
- Singletons – What’s the Deal?
- Audience
- Simple and Clean Code vs. Performance
- Making Yourself at Home in Legacy Code, Part 3: Getting the Team on Board
- Making Yourself at Home in Legacy Code, Part 2: Refactoring
- Making Yourself at Home in Legacy Code, Part 1: Options
- One Hour of Unittests?
- Fun with(out) keyword explicit
- Operator Overloading – Introduction to Boost.Operators, Part 3
- Operator Overloading – Introduction to Boost.Operators, Part 2
- Operator Overloading – Introduction to Boost.Operators, Part 1
- Type Deduction and Braced Initializers
- Plain Pointers as Function Parameters
- Uses of Inheritance
- The Rule of Zero revisited: The Rule of All or Nothing
- Adherence to Design Patterns
- Know your libraries
- First month’s restrospect
- Helper Classes Deserve Some Care, Too
- Over-generalization
- A Casting Show
- Don’t Try Too Hard! – Exception Handling
- Operator Overloading: Common Practice
- Operator Overloading: The Basics
- Heap allocation of local variables
- Hello Blog