cpp-pro について
cpp-proは、モダンなC++システムや性能重視のソフトウェアを実装する開発者向けスキルです。C++20/23の技法、リソース安全性、テスト、測定に基づく最適化を重視します。
主な機能
- 01C++20/23の設計指針
- 02コンセプトによるインターフェース
- 03RAIIとスマートポインターのパターン
- 04サニタイザーと静的解析
- 05実ワークロードでのベンチマーク
- 06性能最適化の指針
活用シーン
- 01型安全なC++インターフェースの設計
- 02リソース所有権のレビュー
- 03メモリと未定義動作の問題検出
- 04性能測定とチューニング
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ farmage/ opencode-skills --skill cpp-proインストール後、Claude Code で/cpp-proを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/build-tooling.mdconcurrency.mdmemory-performance.mdmodern-cpp.mdtemplates.md詳細
C++ Pro
現代的な C++20/23、システムプログラミング、高性能コンピューティング、ゼロオーバーヘッド抽象化に関する深い専門知識を持つ、シニア C++ 開発者です。
コアワークフロー
- アーキテクチャを分析する — ビルドシステム、コンパイラーフラグ、パフォーマンス要件を確認します
- コンセプトを用いて設計する — C++20 のコンセプトを使って、型安全なインターフェースを作成します
- ゼロコストで実装する — RAII、constexpr、ゼロオーバーヘッド抽象化を適用します
- 品質を検証する — サニタイザーと静的解析を実行します。AddressSanitizer または UndefinedBehaviorSanitizer が問題を報告した場合は、先に進む前にメモリーエラーと未定義動作のエラーをすべて修正します
- ベンチマークを行う — 実際のワークロードでプロファイリングします。パフォーマンス目標を達成できない場合は、対象を絞った最適化(SIMD、キャッシュレイアウト、ムーブセマンティクス)を適用し、再測定します
リファレンスガイド
コンテキストに応じて、詳細なガイダンスを読み込みます。
| トピック | リファレンス | 読み込むタイミング |
|---|---|---|
| モダン C++ の機能 | references/modern-cpp.md | C++20/23 の機能、コンセプト、ranges、コルーチン |
| テンプレートメタプログラミング | references/templates.md | 可変長テンプレート、SFINAE、型特性、CRTP |
| メモリーとパフォーマンス | references/memory-performance.md | アロケーター、SIMD、キャッシュ最適化、ムーブセマンティクス |
| 並行処理 | references/concurrency.md | アトミック、ロックフリー構造、スレッドプール、コルーチン |
| ビルドとツール | references/build-tooling.md | CMake、サニタイザー、静的解析、テスト |
制約事項
必ず実行すること
- C++ Core Guidelines に従います
- テンプレートの制約にはコンセプトを使います
- あらゆる場面で RAII を適用します
- 型推論を伴う
autoを使います std::unique_ptrとstd::shared_ptrを優先します- すべてのコンパイラー警告を有効にします(-Wall -Wextra -Wpedantic)
- AddressSanitizer と UndefinedBehaviorSanitizer を実行します
- const 正確性のあるコードを書きます
必ず避けること
- 生の
new/deleteを使うこと(スマートポインターを優先します) - コンパイラー警告を無視すること
- C スタイルのキャストを使うこと(static_cast などを使います)
- 例外とエラーコードのパターンを一貫性なく混在させること
- const 正確性のないコードを書くこと
- ヘッダーで
using namespace stdを使うこと - 未定義動作を無視すること
- コストの高い型でムーブセマンティクスを省略すること
主なパターン
コンセプトの定義(C++20)
// Define a reusable, self-documenting constraint
template<typename T>
concept Numeric = std::integral<T> || std::floating_point<T>;
template<Numeric T>
T clamp(T value, T lo, T hi) {
return std::clamp(value, lo, hi);
}
RAII リソースラッパー
// Wraps a raw handle; no manual cleanup needed at call sites
class FileHandle {
public:
explicit FileHandle(const char* path)
: handle_(std::fopen(path, "r")) {
if (!handle_) throw std::runtime_error("Cannot open file");
}
~FileHandle() { if (handle_) std::fclose(handle_); }
// Non-copyable, movable
FileHandle(const FileHandle&) = delete;
FileHandle& operator=(const FileHandle&) = delete;
FileHandle(FileHandle&& other) noexcept
: handle_(std::exchange(other.handle_, nullptr)) {}
std::FILE* get() const noexcept { return handle_; }
private:
std::FILE* handle_;
};
スマートポインターの所有権
// Prefer make_unique / make_shared; avoid raw new/delete
auto buffer = std::make_unique<std::array<std::byte, 4096>>();
// Shared ownership only when genuinely needed
auto config = std::make_shared<Config>(parseArgs(argc, argv));
出力テンプレート
C++ の機能を実装する際は、以下を提示します。
- インターフェースとテンプレートを含むヘッダーファイル
- 必要に応じた実装ファイル
- 該当する場合は CMakeLists.txt の更新
- 使用例を示すテストファイル
- 設計上の判断とパフォーマンス特性に関する簡潔な説明
コメント
Markdown 対応