のコードは<random>
良い例だと思いますが、むやみに従う必要もありません。では<random>
、次の両方のスタイルが表示されます。
template<unsigned int TDIM> class MyClass
{
public:
static constexpr unsigned int size() {return _size;} // 1
static constexpr unsigned int dim = TDIM; // 2
private:
static const unsigned int _size = TDIM*3;
};
1 と 2 の間の選択は、主に文体的なものです。コンパイル時の結果を要求する方法で使用される場合、これらは両方ともコンパイル時に解決されます。クライアントに入力してもらいたい()
かどうか。いずれかのスタイルを使用する必要がある一般的なコードはありますか? ここでは、汎用コードの要件を満たすことが重要です。
キーワードの使用は、inline
ここでは影響しません。冗長すぎると思いますが、使用しても害はなく、影響もありません。
戻り値の型に追加const
しても、ここには影響しません。冗長すぎると思いますが、使用しても害はなく、影響もありません。
関数スタイルを使用するが、使用しない場合constexpr
:
static unsigned int size() {return _size;}
この関数はコンパイル時に呼び出すことができないため、コンパイル時の定数を期待するコンテキストでは使用できません。アプリケーションやクライアントがそのような機能を必要としない場合、それによって害が生じることはありません。しかし、ツールボックスを持っているならconstexpr
、これはそれを使用するのに最適な場所です。そうすれば、将来のクライアントは次のようなことができます:
template <unsigned N> struct B {};
constexpr auto myclass = MyClass<3>();
// ...
// lots of code here
// ...
B<myclass.size()> b;
これら 2 つは同等です。
static constexpr unsigned int dim = TDIM; // 2
static const unsigned int dim = TDIM; // 3
ただし、関連する型が整数であるという理由だけです。型が整数でない場合は、使用する必要がconstexpr
あり、型にはconstexpr
コンストラクターが必要です。
class A
{
unsigned _i;
public:
constexpr A(unsigned i) : _i(i) {}
};
template<unsigned int TDIM> class MyClass
{
public:
static constexpr unsigned int size() {return _size;}
static constexpr unsigned int dim = TDIM;
static constexpr A a = A(dim);
private:
static const unsigned int _size = TDIM*3;
};
私を含め、ここにいる全員が の使い方をまだ学んでいますconstexpr
。したがって、質問に+1します。