プログラミング/C++
表示
< プログラミング
C++の進化と現代的な設計
[編集]C++は、Bjarne Stroustrupによって1979年に開発が始まった言語で、継続的に進化し続けるプログラミング言語です。C++20とC++23の規格は、言語に革新的な機能をもたらし、モダンなプログラミングパラダイムを支援しています。
最新の言語機能
[編集]コンセプト(Concepts)と制約
[編集]C++20で導入されたコンセプトは、テンプレートの型に対する制約を明確に定義できます。
// テンプレート制約の定義 template<typename T> concept Numeric = std::integral<T> || std::floating_point<T>; // コンセプトを使用した関数テンプレート template<Numeric T> T add(T a, T b) { return a + b; } // 範囲ベースのアルゴリズム template<Numeric T> T sum_range(const std::vector<T>& values) { return std::accumulate(values.begin(), values.end(), T{0}); }
コルーチンと非同期処理
[編集]#include <coroutine> #include <future> #include <iostream> // コルーチンを使用した非同期タスク std::future<int> async_computation() { co_await std::suspend_always{}; co_return 42; } // ジェネレータの実装 std::generator<int> range(int start, int end) { for (int i = start; i < end; ++i) { co_yield i; } } auto main() -> int { // 非同期タスクの実行 auto future = async_computation(); std::cout << "結果: " << future.get() << std::endl; // ジェネレータの使用 for (int value : range(0, 5)) { std::cout << value << " "; } }
モジュール
[編集]// math.cppm (モジュールインターフェース) export module math; export namespace math { export double square(double x) { return x * x; } export class Vector { public: Vector(double x, double y); double length() const; private: double x_, y_; }; } // main.cpp import math; #include <iostream> auto main() -> int { std::cout << "2の二乗: " << math::square(2) << std::endl; math::Vector vec(3, 4); std::cout << "ベクトルの長さ: " << vec.length() << std::endl; }
オブジェクト指向とジェネリックプログラミング
[編集]// コンセプトを使用した汎用的なデータ構造 template<typename T> requires std::copyable<T> class SmartContainer { private: std::vector<T> data; std::function<void(T&)> transformer; public: SmartContainer(std::function<void(T&)> transform = [](T&){}) : transformer(transform) {} void add(T item) { transformer(item); data.push_back(std::move(item)); } // 範囲ベースのアルゴリズム template<typename Predicate> std::vector<T> filter(Predicate pred) const { std::vector<T> result; std::copy_if(data.begin(), data.end(), std::back_inserter(result), pred); return result; } }; auto main() -> int { // 自動変換機能付きコンテナ SmartContainer<std::string> names([](std::string& s) { std::transform(s.begin(), s.end(), s.begin(), ::toupper); }); names.add("alice"); names.add("bob"); // ラムダ式を使用したフィルタリング auto longNames = names.filter([](const std::string& s) { return s.length() > 3; }); }
並行処理と並列アルゴリズム
[編集]#include <thread> #include <mutex> #include <shared_mutex> #include <execution> #include <algorithm> class ThreadSafeCounter { private: mutable std::shared_mutex mutex_; unsigned int value_ = 0; public: void increment() { std::unique_lock lock(mutex_); ++value_; } unsigned int get() const { std::shared_lock lock(mutex_); return value_; } }; auto main() -> int { // 並列アルゴリズム std::vector<int> numbers(1000); std::iota(numbers.begin(), numbers.end(), 1); // 並列アルゴリズムによる変換 std::transform( std::execution::par, // 並列実行 numbers.begin(), numbers.end(), numbers.begin(), [](int x) { return x * x; } ); // スレッドプール std::vector<std::thread> threads; ThreadSafeCounter counter; for (int i = 0; i < 10; ++i) { threads.emplace_back([&counter]() { for (int j = 0; j < 1000; ++j) { counter.increment(); } }); } for (auto& t : threads) { t.join(); } }
メモリ管理と所有権
[編集]#include <memory> class Resource { public: Resource(int value) : data(value) { std::cout << "リソース作成: " << data << std::endl; } ~Resource() { std::cout << "リソース破棄: " << data << std::endl; } private: int data; }; void manage_resources() { // ユニークポインタ(排他的所有権) auto uniqueRes = std::make_unique<Resource>(42); // 共有ポインタ(参照カウント) auto sharedRes1 = std::make_shared<Resource>(100); auto sharedRes2 = sharedRes1; // 参照カウントが増加 }
適用領域と設計哲学
[編集]C++は以下の分野で卓越しています:
- ゲーム開発
- システムプログラミング
- 高性能コンピューティング
- 組み込みシステム
- リアルタイムシステム
まとめ
[編集]C++は、低レベルの効率性と高レベルの抽象化を両立する言語です。C++20以降の規格は、言語に柔軟性と表現力をもたらし、現代的なプログラミングパラダイムへの対応を強化しています。複雑さの中にも洗練された設計哲学を持ち、プログラマに強力な表現力を提供します。