C++

【OpenFOAMの理解のためのC++メモ(3)】関数テンプレート、クラステンプレート

これからOpenFOAMのC++を学ぶために基本的な内容をメモとして残しておきます。

OpenFOAMはC++プログラミング言語により実装されたCFDに必要な機能がまとめられたオブジェクト指向の考え方で設計されているツールです。

本記事の内容

C++の基本的な内容を理解する。
テンプレート。

C++の全てを学ぼうとすると膨大過ぎてとても扱いきれないので、必要最低限知っておくとよい内容を簡単にまとめていきます。

関数テンプレート

全く同じ処理ですが関数に引き渡したときのデータの型が違うという場合というのがありますよね。
そんな時は以下のように別々に関数を用意する必要があります。

例えば、
●整数の足し算をしたい場合
●文字列の足し算をしたい場合

add()という関数を2つ作って「引数のデータの型」と「返り値のデータの型」が異なる別の関数を2つ作る必要があります。

面倒なので以下のよう関数テンプレートを使ってデータの型を引き渡すことができます。

ポイントは以下の2つですね。

画像

関数テンプレートのイメージとしては add<int>(25, 30)とすることで以下のように関数に引き渡されたデータの型が変わります。

画像

クラステンプレート

クラス内でテンプレートが使用された場合もやってみます。
以下の2つのファイルを用意します。

  • calc.h:クラスの定義
  • main.cpp:メインファイル

calc.h

main.cpp

画像

inline関数を使ってクラス内に関数を定義しましたが、クラス内に関数を定義した場合自動的にinline関数になるようですが、ここでは明示的にinline関数の記述を行いました。

2重インクルード防止

2重インクルード防止のためにcalc.hに、

という記述を行いましたが、これは例えばmain.cppでcalc.hをインクルードして、別のファイルでもcalc.hをインクルードして・・・・また別のファイルでもcalc.hをインクルードしてとなると、何回もcalc.hの中身をインクルードしていることになり重複してしまいます。
なので、
●#ifndef _CALC_Hが定義されているかを確認
●#define~#endifまでの記述を1回だけしかインクルードしないようにコンパラに指令を与える役割があります。

画像

以下のようにしてコンパイルを行います。

参考記事

OpenFOAMの簡単なコードを書いてカスタマイズ練習ができる内容を挙げておきます。

C++の基礎を学びたいときにとても参考になる動画を挙げておきます。

OpenFOAMに特化した内容を学びたい場合は以下の記事が参考になります。

参考書

持っている参考書をC++の書籍を載せておきます。

1週間でC++の基礎が学べる本

1週間でC++の基礎が学べる本

亀田 健司
1,430円(04/26 00:46時点)
発売日: 2021/03/12
Amazonの情報を掲載しています

↑こちらは初めにC++を学ぶにはちょうど良い内容かと思います。
実はこちらに書籍の内容がまとめられています。

独習C++ 新版

独習C++ 新版

高橋 航平
3,644円(04/26 03:07時点)
発売日: 2019/11/11
Amazonの情報を掲載しています

↑基礎が身に付いたら体系的に学ぶために持っていても良いと思う書籍です。

江添亮のC++入門

江添亮のC++入門

江添 亮
5,500円(04/26 03:07時点)
Amazonの情報を掲載しています

「現行の規格に準拠したC++プログラムの書き方を徹底的に解説していく」と謳っているように内容も中級者以上を対象にした本格的なC++の書籍です。
実はこちらに本の内容がそのままアップされています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です