コンテンツにスキップ

N2 コース

1. 概要

最新の C++(シープラスプラス)標準を活用し、可読性とユーザーフレンドリーな設計を兼ね備えた高性能ライブラリを開発する方法について学ぶ。

内容:

  • 現代的な C++ のコーディング技法を習得する。
  • C++ ライブラリ開発における設計決定を学ぶ。

トピック:

  • C++ 言語の進化と、そのライブラリ設計への影響
  • 効率的かつ堅牢な C++ コードを書くための実践的なテクニック
  • ライブラリ設計における重要な C++ の機能と特有の設計パターン

C++ の基本的な構文(関数、クラス)を用いたコーディング経験があることが望ましいが、講義資料とサポートによって、すべての参加者が目標を達成できるよう支援する。

2. C++ の学習資料

受講にあたって C++ を学習・再学習したい参加者のために、次の 2 つの学習資料を用意した。

  • [改訂第5版]C++ ポケットリファレンス
    • 配布した書籍
  • C++ の基礎
    • 本サイト上で公開する C++ チュートリアル。
    • 他言語の経験を前提に、現代的な C++ の要点を簡潔に解説。
    • 1 ページあたり 10~30 分で読み終えられる資料を数編用意する。

3. ツールの準備

3.1 開発環境

  • C++23(シープラスプラスにじゅうさん)機能をサポートする C++ 開発環境
  • プログラムで作成したファイルや画像の内容を確認できる GUI(ジーユーアイ)環境

IDE(アイディーイー)の使用を推奨

トラブルや非効率を避け、最新の C++ 言語仕様に対応した開発環境を確実に導入するために、C++ 開発に適した IDE を使用するとよい。マウスクリックだけで 15~30 分で導入できる。以下のページで基本的な使い方と推奨設定を説明する。

  • Windows(ウィンドウズ)の場合: Visual Studio 2022 Community 17.10(ビジュアルスタジオ 2022 コミュニティ)
  • macOS(マックオーエス)の場合: Xcode 15.4(エックスコード)

当日の PC 貸し出し

必要な環境を持参できない参加者用に、受講日当日は環境構築済みの Windows ノート PC を 3 台用意する。

3.2 上記以外の開発環境の検証

3.1 で説明した「Visual Studio 2022 17.10」「Xcode 15.4」以外を使う場合は、次の 4 つの検証プログラムが正常に動作することを確認する。GCC 14 以降を使い、コンパイル時オプションに -std=c++2b または -std=gnu++2b を指定する。

  • 検証プログラム 1: C++23 をサポートする。
  • 検証プログラム 2: C++23 の std::print を使える。
  • 検証プログラム 3: UTF-8 がデフォルトの文字セットである。
  • 検証プログラム 4: 複数のソースファイルをコンパイルでき、プログラムでテキストファイルを出力できる。
検証プログラム 1

Main.cpp
#include <iostream>

int main()
{
#if defined(_MSC_VER)
	#if _MSVC_LANG < 201103L
		std::cout << "before C++11\n";
	#elif _MSVC_LANG == 201103L
		std::cout << "C++11\n";
	#elif _MSVC_LANG == 201402L
		std::cout << "C++14\n";
	#elif _MSVC_LANG == 201703L
		std::cout << "C++17\n";
	#elif _MSVC_LANG == 202002L
		std::cout << "C++20\n";
	#elif 202002L < _MSVC_LANG 
		std::cout << "C++20 or later\n";
	#endif
#else // その他のコンパイラの場合
	#if __cplusplus < 201103L
		std::cout << "before C++11\n";
	#elif __cplusplus == 201103L
		std::cout << "C++11\n";
	#elif __cplusplus == 201402L
		std::cout << "C++14\n";
	#elif __cplusplus == 201703L
		std::cout << "C++17\n";
	#elif __cplusplus == 202002L
		std::cout << "C++20\n";
	#elif 202002L < __cplusplus
		std::cout << "C++20 or later\n";
	#endif
#endif
}
求められる出力
C++20 or later

検証プログラム 2

Main.cpp
#include <print>

int main()
{
	std::println("Hello, World!");
}
求められる出力
Hello, World!

検証プログラム 3

Main.cpp
#include <iostream>
#include <cstring>

int main()
{
	const char s[] = "あいうえお"; // デフォルトの文字セットでエンコードされる
	const char8_t u8[] = u8"あいうえお"; // 必ず UTF-8 でエンコードされる

	if ((sizeof(s) == sizeof(u8)) // 文字列のバイト列長が等しい
		&& (std::memcmp(s, u8, sizeof(s)) == 0)) // バイト列の内容が等しい
	{
		std::cout << "UTF-8\n";
	}
	else
	{
		std::cout << "non UTF-8\n";
	}
}
求められる出力
UTF-8

検証プログラム 4
TextFile.hpp
#pragma once
#include <string>

namespace mylib
{
	bool WriteTextFile(const std::string& path, const std::string& text);
}
TextFile.cpp
#include <fstream>
#include "TextFile.hpp"

namespace mylib
{
	bool WriteTextFile(const std::string& path, const std::string& text)
	{
		std::ofstream file{ path };
		
		if (!file)
		{
			return false;
		}

		file << text;
		
		return true;
	}
}

Main.cpp
#include <iostream>
#include <string>
#include "TextFile.hpp"

int main()
{
	const std::string text = "Hello, World!";

	if (mylib::WriteTextFile("output.txt", text))
	{
		std::cout << "OK\n";
	}
	else
	{
		std::cout << "Failed\n";
	}
}
求められる出力
OK

  • 出力されたテキストファイルの場所も確認する。

4. 質問の方法

Discord(ディスコード)サーバ #n2-cpp-library チャンネルで受け付ける。

  • ChatGPT-4o(チャットジーピーティー・フォーオムニ)や Claude 3.5 Sonnet(クロード 3.5 ソネット)は、比較的簡単な質問にはおおよそ正確に回答できるが、複雑な質問になるほど信頼性が低下する。
  • 「生成 AI(エーアイ)はこう言っているが正しいのか?」という質問にも対応する。

5. 用語の読み仮名

本講義資料に記述している用語の読みは、あくまで筆者がこう読むという例である。複数の読み方があるものや、コミュニティ・言語圏によって読み方が異なるものも多いので、記述している読みが唯一の正解というわけではない。

用語 筆者の読み方 それ以外の読み方
enum イニューム イーナム、イナム
std:: エスティーディー スタンダード、ストゥード(英語圏で多い)

6. 講義への要望

Discord サーバ #n2-cpp-library チャンネルで受け付ける。