この記事について
身内向けのアドカレ用に書いた記事です。
久しぶりにC++を触って、結構機能が増えてたのでこの感動を押し付ける分かち合うために記事書きました。
※C++履修者向けになってます。ごめんね🙇
※かさ増しのために古い機能も入れてます。ごめんね🙇
参照型 (C++11)
これまでのC++で参照といえばアドレス参照が一般的でした。
pointer.cpp
void hoge(const std::string* src) {
// なにかする
}
// コピーされるので効率悪い
void fuga(const std::string src) {
// なにかする
}
int main() {
std::string src = "文字列";
hoge(&src);
fuga(src);
}
参照型が追加されたので、アドレス渡しとか気にしなくてよくなりました。
ぬるぽも起きないね、やったね。
reference.cpp
void hoge(const std::string& src) {
// なにかする
}
int main() {
std::string src = "文字列";
hoge(src);
}
コンパイル時計算 (C+11)
constexpr
を使うとコンパイル時に計算が行われます。
そのため実行時の計算が減りただでさえ速いのがさらに速くなります。やったね。
constexpr.cpp
constexpr int sum(int a, int b) {
return a + b;
}
// sはコンパイル時に計算されて「120」になる 速くなる 正義
constexpr s = sum(100, 20);
構造化束縛 (C++17)
モダンな言語によくあるタプルの展開ができるようになりました。
今風でかっこいいね。
tuple.cpp
std::tuple<int, std::string> moge() {
return { 100, "name" };
}
int main() {
auto [age, name] = moge();
}
ちなみに、ちょっと設定すれば自前で作ったクラスでもできるらしい。
名前付きモジュール (C++20)
今まではヘッダー書いてそれをinclude
していました。
include
するたびにヘッダーが展開されるので、100万行のヘッダーなんぞを何度もinclude
した日には目も当てられない大惨事になっていました。
include.h
namespace hoge {
void doHoge() {
// めんどいのでinline
}
}
include.cpp
// include.hの中身がここに展開される
#include "include.h"
int main() {
hoge::doHoge();
}
新しく追加された名前付きモジュールでは、翻訳単位がモジュール(.ixx)ごとになっているので、この心配がなくなりました。
module.ixx
export module Hoge;
namespace hoge {
void doHoge() {
// めんどいのでinline
}
}
module.cpp
// Hogeモジュールはコンパイル済み
// includeのように展開されたりしない
import Hoge;
int main() {
hoge::doHoge();
}
まとめ
Rustとか、C++の代替になりそうな言語も出てきてますが、実はC++26がすでに策定されていたりして、まだまだ長く使われていきそうです。
君もC++使いにならないか?