C++について調べると、同じような概念に対して微妙に用語が異なったりする事がある。
今日出くわしたのは関数テンプレートとテンプレート関数だ。
夜ねれなくなるのでちゃんと調べてまとめましたよ。
さっそくまとめ
- 関数テンプレート:関数を生成するテンプレート
- テンプレート関数:関数テンプレートからインスタンス化された(生成された)関数
ただし、区別する必要がなければ関数テンプレートと呼ぼう。
テンプレート関数という用語は曖昧なので使用せず、関数テンプレートインスタンスと呼ぼう。
くわしく
ビャーネ・ストロヴストルップ氏の鈍器書(プログラミング言語C++)には、こう書かれている。
用語としてのクラステンプレート(class template)とテンプレートクラス(template class)のセマンティクスを区別する人もいるが、私は区別しない。区別するには微妙すぎるからだ。したがって2つの用語は交換可能と考えることにしよう。同様に、関数テンプレートとテンプレートクラスも交換可能と考えることにしよう。
つまりどっちもほとんど同じと考えて良いということだね。
ビャーネくんさんがいうなら間違いないであろう。
ただし、違いは理解しておく必要がある。
すたふろにはこう書いてある。
関数テンプレートはテンプレートだ。テンプレート関数は時々同じ意味に使用され、たまに「インスタンス化された関数」を意味している。この曖昧さに対して、前者対しては関数テンプレート、後者に対しては、関数テンプレートインスタンス、もしくは関数テンプレートのインスタンスと呼ぶのが良いだろう。気をつけないといけないのは、関数テンプレートは関数ではないということだ。また、同じことがクラステンプレートとテンプレートクラスに対しても言うことができる。
明快ですありがとう。
日本語としてもあとに来る語が主と考えられるので、そのままの説明。
キツネザルは猿だし、イタチキツネザルも猿だ。
ただ単に、テンプレート
か関数
かの違いとなる。
そして、特に理由がない限り関数テンプレートでOKということがわかった。
また、テンプレート関数という用語は曖昧なので使用しないほうが良いということもわかった。
あらためて自分が見てきたサイトを見直すと、
明確に使い分けているところは見たところ無く、関数テンプレートと同じ意味でテンプレート関数と読んでいるサイトがいくつかある。
中には有名なサイトもある。
正しく使い分けているのであればいいのだが、そうでない場合があり私のような初心者は本当に困惑する。
テンプレート関数
に出くわしたらそのサイトは読み手のことはあまり考えていないかもしれない。
こういう問題が他にもあった気がするが忘れた。すぐにメモるべしだよね。