[解決済み] C++11でconstexpr機能はいつ使うべきですか?
2022-03-14 10:33:05
質問
常に5を返す関数があることは、関数の呼び出しの意味を壊している、あるいは希薄にしているように思えます。 この機能には理由や必要性があるはずで、そうでなければC++11には存在しないはずです。 なぜ存在するのでしょうか?
// preprocessor.
#define MEANING_OF_LIFE 42
// constants:
const int MeaningOfLife = 42;
// constexpr-function:
constexpr int MeaningOfLife () { return 42; }
もし私がリテラル値を返す関数を書いていて、コードレビューに来たとき、誰かがreturn 5と書く代わりに定数値を宣言すべきだと教えてくれるような気がします。
どうすればいい?
もうちょっと複雑なことをするとします。
constexpr int MeaningOfLife ( int a, int b ) { return a * b; }
const int meaningOfLife = MeaningOfLife( 6, 7 );
これで、可読性を良好に保ちつつ、定数まで評価できるものができ、定数を数値にするだけでなく、少し複雑な処理もできるようになりました。
基本的に何をやっているのかが明確になるので、保守性を高めるのに有効な手段です。 そして
max( a, b )
例えば
template< typename Type > constexpr Type max( Type a, Type b ) { return a < b ? b : a; }
これは非常にシンプルな選択ですが、もしあなたが
max
を定数値で指定すると、実行時ではなく、コンパイル時に明示的に計算されます。
他の良い例としては
DegreesToRadians
という関数があります。 ラジアンより度の方が読みやすいと思うのは誰でも同じだろう。 180度はラジアンでは3.14159265(円周率)であることは知っていても、次のように書くともっと分かりやすい。
const float oneeighty = DegreesToRadians( 180.0f );
良い情報がたくさんあります。
関連
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] 仮想デストラクタはいつ使うのか?
-
[解決済み] C++でクラスと構造体はいつ使い分けるべきか?
-
[解決済み] std::move()とは何ですか?また、どのような場合に使用するのですか?
-
[解決済み] constexpr` と `const` の相違点
-
[解決済み] noexceptを本当に使うべきはいつですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】 unsigned int vs. size_t
-
[解決済み】非静的メンバ関数への参照を呼び出す必要がある
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み】C++でユーザー入力を待つ【重複あり
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み] 解決済み] `pthread_create' への未定義の参照 [重複] [重複
-
[解決済み] constexpr` と `const` の相違点
-
[解決済み] 変数における const と constexpr の比較
-
[解決済み】std::stringをconstexprで使用することは可能ですか?