次のような C++ マシン ライブラリ (dlib) のクラス内に typedef があります。
typedef dlib::matrix<double, 64, 1> sample_type;
ただし、64 は実際には変数です。クラス全体で typedef が見えるようにしたいのですが、コンストラクターが呼び出されたときに 2 番目のパラメーター (64) を引数にしたいと考えています。typedef をどこでも見えるようにしながら、どうすればこれを達成できますか?
これは実際、dlibWebページでよくある質問の1つです。あなたがすることはこれです:
typedef dlib::matrix<double, 0, 1> sample_type;
sample_type myvect(64); // now the 64 is a runtime argument.
コンストラクターの引数にはその制限がないのに対し、テンプレート パラメーターはコンパイル時に認識されている必要があるため、これは現在の設計では不可能です。
この理由は、テンプレートの展開はそれ自体の型として見なされる必要があるためです。テンプレート パラメータは型の一部です (std::vector<int>
は とは異なる型ですstd::vector<float>
)。
一般的なケースとして、これは不可能です。あなたは以下を書きたいかもしれませんが:
template <int matrix_size>
struct sample_type : public dlib::matrix<double, matrix_size, 1>
{
sample_type data1;
sample_type<16> data2;
};
sampe_type<32> var32;
sampe_type<36> var36;
テンプレート内で2つのデータフィールドが定義されていることに注意してください。最初のデータフィールドは、現在のインスタンス化パラメーターで作成されます。2番目のデータフィールドは、明示的なパラメータを使用して作成されます。
ご覧のとおり、テンプレートの内側は希望どおりのようですが、外側では定数のみを使用できます。