Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
C++ のあれこれ
Search
緑獺おがめ
December 14, 2025
Programming
57
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
C++ のあれこれ
Kyutech大LT祭で発表した C++ LT のスライド
緑獺おがめ
December 14, 2025
Other Decks in Programming
See All in Programming
Domain-Driven Transformation
hschwentner
2
2.3k
contenteditable と日本語入力に向き合う
colorful12
0
200
パズルゲームの作り方 / how to make puzzle games
kaityo256
PRO
2
290
R8 の設定見直しでアプリサイズ削減
andpad
0
220
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
610
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
8.5k
カツオ、ご期待ください
suneo3476
0
190
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
380
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
190
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
8
2.2k
dotNET_vulnclicker_intro.pdf
deka_morita
0
140
Jetpack Compose Mechanisms
skydoves
3
820
Featured
See All Featured
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.8k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
2
330
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
162
16k
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.6k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
640
XXLCSS - How to scale CSS and keep your sanity
sugarenia
250
1.3M
Practical Orchestrator
shlominoach
192
12k
The Curse of the Amulet
leimatthew05
3
16k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
600
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
What does AI have to do with Human Rights?
axbom
PRO
1
2.5k
Transcript
C++ のあれこれ 緑獺 おがめ
struct 緑獺おがめ { std::vector<std::string> 所属 = {"C3", "KyuteXR"}; std::array<std::string, 6>
好きな拡張子 = { ".cpp", ".hpp", ".cc", ".hh", ".cxx", ".hxx" }; std::vector<std::string> 好きなもの = { "#ccff00", " カワウソ" } }; 自己紹介
1983年に公開された,C言語から派生したプログラミング言語. C言語の機能を継承しつつ,オブジェクト指向プログラミング,ジェネリックプログラ ミングなどの複数のプログラミングパラダイムが組み合わされている. 低レイヤーから高レイヤーまで扱える. 近年でも3年ごとに標準規格が改定されている. C++ とは
なんでもできる!!!!!!!!!! C++ で出来ること
ゲーム開発 DirectX DxLib Unity Unreal Engine 画像処理 (OpenCV) 並列分散処理 組み込み
C++ で出来ること
Unreal Engine 3D ゲームを開発するのに便利. 割とブループリントを使うことが多 いような気もするが, C++ を記述す ることでも開発が可能. C++
を扱えるフレームワークなど
Qt C++ でクロスプラットフォームな GUI アプリケーションを開発できる やつ C++ を扱えるフレームワークなど
Siv3D C++ でクロスプラットフォームな GUI アプリケーションを簡単に開発 できる OSS フレームワーク 大好き C++
を扱えるフレームワークなど
Crow C++ で Web バックエンドが建てれる やつ. 結構簡単な記述で REST API を建てら
れる. C++ を扱えるフレームワークなど
Drogon C++ で Web バックエンドが建てれる やつ. テンプレートエンジンも備えてお り,フロントも開発することができ る. めちゃくちゃ高速で,とある計測で
は全言語の様々な Web バックエンド フレームワーク内で最速だったとい う結果も. C++ を扱えるフレームワークなど
複数のコンパイラがある GCC (GNU Compiler Collection) Clang MSVC 同じ C++ でもコンパイラによって動作が違うことがある.
コンパイラの種類
配列を扱うとき…… int arr[10]; STL を使おう
std::vector<T> , std::list<T> , std::array<T, N> を使おう!! C++ には配列を表すクラスが用意されている. std::vector<int>
arr; std::list<int> arr; std::array<int, 10> arr; これらを扱うことで,配列に対する処理が統一できる. 例: sort std::sort(arr.begin(), arr.end()); STL を使おう
C++では変数の宣言の際に型の指定が必要となる. しかし,ライブラリで提供されるような長いクラス名を書くのが面倒だったり,明ら かにわかる部分で書くのは面倒. そこで auto を用いる. これによってコンパイル時に自動で型推論を行ってくれる. auto num =
10; // int auto str = "hello, world!!" // const char* auto が便利
C / C++ において,関数への引数の受け渡しは明示しない限り値渡しとなる. 関数内で値の変更を行っても反映されない. C言語においてはポインタを渡すことで関数内で値の変更を行えるようにしていた. void func(int* n) {
*n += 1; } しかしこの場合,呼び出し時に & をつける必要がある. func(&num); 値渡しと参照渡し
C++ では,以下のようにすることで参照渡しをすることができる. 呼び出し時にも変数名のみでよい. void func(int& n){ n += 1; }
func(num); サイズの大きい構造体など,コピーに時間のかかるものに有効. 値渡しと参照渡し
C言語由来のポインタの問題 メモリーリーク: 確保したメモリが開放されずに残り続けること malloc などでメモリを確保した場合は,その領域を人の手で解放してやる必要があ る. そこで便利なのがスマートポインタである. スマートポインタ
std::shared_ptr<T> , std::unique_ptr<T> これらのクラスは内部にカウンタを持っており,そのカウンタが0になったときに自動 でメモリを解放してくれる. 便利マン. { std::shared_ptr<int> ptr =
std::make_shared<int>(100); // カウンタ 1 { std::shared_ptr<int> ptr2 = ptr; // カウンタ 2 } // カウンタ 1 } // ここで解放される スマートポインタ
他の言語にも Generics という名前で存在している機能. これにより,クラスの抽象化が可能になった. 例として,空間上での座標を表す型を扱いたい場合,以下のようにすることでメンバ 変数を任意の型にすることができる. template<typename T> struct Point
{ T x; T y; }; Point<int>; Point<double>; Point<unsigned long long> template
template では任意の型を指定することができますが,それに制約を設けたいことがあ る.そこで使うのが, C++20 から追加された concept という機能である. 標準で用意されている concept を用いることもできますし,自前で定義することもで
きる. template<typename T> concept arithmetic = std::is_arithmetic_v<T>; template<arithmetic T> struct Point { /* definition */ }; Point<int>; Point<std::string>; // Error!! concept
requires を用いたより細かな制約 以下のように記述することで,特定のメンバ変数やメソッドを持つかどうかなどまで 指定することができる. template<typename T> concept vector = requires(T&
t, const T& ct) { typename T::value_type; { t.normalized() } -> std::same_as<T>; { ct.normalized() } -> std::same_as<T>; { t.length() } -> std::floating_point; }; concept
concept は C++20 から追加された機能. C++17 以前では SFINAE というテクニックを用いることで制約を実装していた. Substitution Failure
Is Not An Error 直訳すると「置換の失敗はエラーではない」 わけわかめですね. 説明するとこれ単体でLTができるほど長くなるため,かなり割愛して説明する. SFINAE
例として,与えられた二つの変数が加算可能かどうかを判定する関数を作ってみる. template<typename lT, typename rT> auto is_addable(lT l, rT r)
-> decltype(l + r, bool()){ return true; } auto is_addable(...) -> bool { return false; } is_addable(3, std::string("hoge")) のように加算できない型を引数として渡した 場合,上の定義の l + r の部分で加算ができないため, template の置換に失敗す る. しかし,即座にコンパイルエラーとならず,オーバーロード候補から除外される. 結果,フォールバック関数である下の定義が呼ばれ, false が返る. SFINAE
SFINAE を扱う上で頻出する std::enable_if というクラスがある. これは,テンプレート引数として bool 値と任意の型を受け取る. bool が true
の場合はメンバ型 type として第二引数の型を持つ. typename std::enable_if<true, int>::type // int 一方 false の場合は type を持たないため,コンパイルエラーとなる. typename std::enable_if<false, int>::type // Compile Error !! SFINAE ではこのエラーが発生する特性を利用する. SFINAE
template< typename T, typename std::enable_if<std::is_arithmetic<T>::value, void*>::type = nullptr > class
Point{ /* definition */ }; T が数値型ではない → std::enable_if が type を持たない → 置換失敗 これによってこの定義はオーバーロード候補から除外され,その後 Point の定義がな くなるためコンパイルエラーとなる. 制約を満たさない場合のフォールバック型を用意しておけば,そちらが定義としてよ ばれることとなる. SFINAE
C++ は難しいと思われがちですが,実際難しいです.(どの技術もそう) しかし,最初に全て理解しようとする必要はありません. 最初は std::vector などの簡単な機能から少しずつ慣れていってください. 今日わからなかった部分は「こういう世界があるんだな」くらいに思ってくれると嬉 しいです. それではみなさま良き C++
ライフを!!! あとがき