Write modern C++ with RAII, smart pointers, and STL. Use for C++ development, memory safety, or performance optimization.
Install
npx skillscat add htlin222/dotfiles/cpp Install via the SkillsCat registry.
This skill provides guidance for writing modern C++ code using RAII, smart pointers, and STL features. It addresses memory management, performance optimization, and legacy code modernization by demonstrating safe resource handling, container usage, and template metaprogramming. Developers should use it when working on C++ projects requiring memory safety, efficient resource management, or code modernization from older C++ standards.
C++ Development
Write safe, performant modern C++ code.
When to Use
- Writing C++ code
- Memory management issues
- Template metaprogramming
- Performance optimization
- Legacy C++ modernization
Modern C++ Patterns
Smart Pointers
// Unique ownership
auto ptr = std::make_unique<Resource>();
process(std::move(ptr));
// Shared ownership
auto shared = std::make_shared<Resource>();
auto copy = shared; // Reference count: 2
// Weak reference (no ownership)
std::weak_ptr<Resource> weak = shared;
if (auto locked = weak.lock()) {
// Use locked
}RAII
class FileHandle {
FILE* handle_;
public:
explicit FileHandle(const char* path)
: handle_(fopen(path, "r")) {
if (!handle_) throw std::runtime_error("Failed to open");
}
~FileHandle() { if (handle_) fclose(handle_); }
// Rule of 5
FileHandle(const FileHandle&) = delete;
FileHandle& operator=(const FileHandle&) = delete;
FileHandle(FileHandle&& other) noexcept
: handle_(std::exchange(other.handle_, nullptr)) {}
FileHandle& operator=(FileHandle&& other) noexcept {
std::swap(handle_, other.handle_);
return *this;
}
};Containers and Algorithms
std::vector<int> nums = {3, 1, 4, 1, 5};
// Prefer algorithms over raw loops
std::sort(nums.begin(), nums.end());
auto it = std::find_if(nums.begin(), nums.end(),
[](int n) { return n > 3; });
// Range-based for
for (const auto& num : nums) {
std::cout << num << '\n';
}
// Structured bindings (C++17)
std::map<std::string, int> scores;
for (const auto& [name, score] : scores) {
std::cout << name << ": " << score << '\n';
}Templates
// Concepts (C++20)
template<typename T>
concept Numeric = std::integral<T> || std::floating_point<T>;
template<Numeric T>
T sum(const std::vector<T>& values) {
return std::accumulate(values.begin(), values.end(), T{});
}
// SFINAE (pre-C++20)
template<typename T,
typename = std::enable_if_t<std::is_arithmetic_v<T>>>
T multiply(T a, T b) { return a * b; }Best Practices
- Prefer
constandconstexpr - Use smart pointers over raw pointers
- Follow Rule of 0/5
- Prefer STL algorithms
- Use
std::string_viewfor read-only strings - Enable warnings:
-Wall -Wextra -Wpedantic
Common Issues
| Issue | Symptom | Fix |
|---|---|---|
| Memory leak | Growing memory | Use smart pointers |
| Dangling ptr | Crash/UB | Check lifetime |
| Buffer overflow | Crash/security | Use std::vector/span |
| Data race | Inconsistent state | mutex/atomic |
Examples
Input: "Fix memory leak"
Action: Replace raw pointers with smart pointers, ensure RAII
Input: "Modernize this C++ code"
Action: Apply C++17/20 features, use STL, improve safety