私は多くの質問と回答を読んだことがありますが、this questionが私の目を最も惹きました。それとその答えは役に立ちますが、私はまだ非型のテンプレート引数を使うことの背後にある使用法と理論を完全には理解していないと感じています。それらは、いつ使われるかについての多くの有用な例を提供していますが、実際には非型テンプレート引数の背後にある理論については何の示唆もしていません。非型テンプレート引数が使用されるのはなぜですか?
私は、具体例ではなく、より一般的には、通常の関数引数だけではなく、非型テンプレート引数を使用する傾向にあることに興味があります。
私はコンパイル時に決定され、新しい呼び出しごとに、型のないテンプレート引数の値が決定された新しい関数が作成されることを理解します。だから、なぜ私は関数に必要なパラメータを入力して、同じ結果を持っていると思いますか?おそらく、コンパイルされた関数が1つしかない場合、同じ関数の多くの異なるインスタンスを作成したいのです。
最後に、this pageのcplusplus.comの最後のセクションに記載されているように、#2ではなく#1を行う傾向がありますか?
#1:
template <class T, int N>
T fixed_multiply (T val)
{
return val * N;
}
int main() {
std::cout << fixed_multiply<int,2>(10) << '\n';
std::cout << fixed_multiply<int,3>(10) << '\n';
}
は#2:
template <class T>
T fixed_multiply (T val, int N)
{
return val * N;
}
int main() {
std::cout << fixed_multiply<int>(10, 2) << '\n';
std::cout << fixed_multiply<int>(10, 3) << '\n';
}
また、いずれかの任意のパフォーマンス上の利点や、そのようながあるでしょうか?非タイプのテンプレート引数を使用することで利益を得ることができる一般的なアプリケーションはありますか?これは特定のアプリケーションで特定の結果を得るために使用される非常に技術的なパラメータですか?
編集:これは何らかの理由で重複しているとマークされていますが、最初の段落で私の同様の質問の理由が説明されています。
'std :: transform'を使用してvectorのすべての要素に5を掛けるために第2の変種を使用してください –
あなたが表示する例ではそれほど大きな違いはありませんが、大きな違いは、テンプレート化されたバージョンをコンパイル時に評価される 'constexpr'関数にすることができるからです。非型テンプレート引数は、['std :: array'](http://en.cppreference.com/w/cpp/container/array)や実際の配列を得るためにCスタイルの配列を取る関数sizeをタイプし、サイズを実行時引数として渡す必要はありません。 –
@Amitそれは質問の最初の行にリンクされた同じ質問です。 – Barmar