以下の例のように、浮動小数点定数を変数として宣言することと関数として宣言することの間に違いはありstatic constexpr
ますか、それとも単にスタイルの問題ですか?
class MY_PI
{
public:
static constexpr float MY_PI_VAR = 3.14f;
static constexpr float MY_PI_FUN() { return 3.14f; }
}
constexpr
機能関数には、自由変数にはない利点があります (C++14 まで): クラスのボイラープレートなしで簡単にテンプレート化できます。つまりpi
、テンプレート引数に応じて精度を設定できます。
template<typename T>
constexpr T pi();
template<>
constexpr float pi() { return 3.14f; }
template<>
constexpr double pi() { return 3.1415; }
int main()
{
constexpr float a = pi<float>();
constexpr double b = pi<double>();
}
ただし、フリー関数の代わりにメンバー関数を使用することにした場合、メンバー変数static
よりも短くも書きやすくもなりません。static
constexpr
変数変数を使用する主な利点は...まあ。定数が必要ですよね?意図を明確にすることは、ここで最も重要なポイントの 1 つかもしれません。
クラスで同等の動作を行うこともできますが、クラスがその他の数学定数を含むクラスである場合は、次のように使用する必要があります。
constexpr float a = constants<float>::pi;
または、クラスが表すことだけを意図している場合は、次のようになりますpi
。
constexpr double = pi<double>::value;
最初のケースでは、変数を使用することを好むかもしれません。これは、記述が短くなり、定数を使用していて何かを計算しようとしていないことが実際に示されるためです。ただし、pi を表すクラスだけがある場合は、クラスconstexpr
全体ではなく自由関数を使用できます。IMHOの方が簡単です。
constexpr
変数テンプレートただし、C++11 の代わりに C++14 を使用することを選択した場合は、次の種類のconstexpr
変数テンプレートを作成できることに注意してください。
template<typename T>
constexpr T pi = T(3.1415);
これにより、次のようなコードを記述できます。
constexpr float a = pi<float>;
C++14 以降では、これが望ましい方法かもしれません。古いバージョンの標準を使用している場合でも、最初の 2 つの段落は保持されます。