多重定義

zxc
記事: 79
登録日時: 13年前
住所: 日本の背骨(?)あたり

多重定義

投稿記事 by zxc » 12年前

  どこかで流し読みした本で見たのかもしれないが、「テンプレートはあらゆる型のオーバーロードである」というような考えが自分の中にある。オーバーロードというからには、関数テンプレートに限っての記述だったのだろうか。今まで「何か面倒、読みにくそう」という不快感からテンプレートを避けてオーバーロードでやってきましたが、どうなんでしょうね。テンプレートがよくわからないから、比較できない。

  今のところ「テンプレートはあらゆる型に対応できるようにする」というような認識だが、それってどうなんだろう。認識が違う可能性は一旦おいておくとして、あらゆる型を全く同じ名前の関数が処理するなんて実装は、多く見られるものなんだろうか。正直なところ、おおよその場合では( 使う型の数 < 全ての型の数 )が成り立つだろうから、使う可能性のある型だけを選択したい。そしてそれはオーバ-ロードで出来るだろうが、使う型が増えるほど面倒なことになる。テンプレートが勝手に使われなかった型は省いてくれればいいのだけれど、そんな上手い話あるんだろうか。

  何故気にするのかというと、テンプレートがあらゆる型のオーバーロードを用意してしまうなら、そもそも「その関数が扱うべきでない型」を扱う関数も用意されるはず。関数内の処理でエラーにならなければ、それは面倒なバグの原因となると考えているから。今のところ特殊化なり例外なりassertなりで防げるかもしれないと考えたが、その手間や方法の確立までの投資はおそらく、コピーペーストによる量産オーバーロードよりも大きなものとなるだろうし、結局書くコードは減らない。そして読むのもより複雑で面倒。それなら結局使う意味がよくわからないと考えてしまう。他にそれを防ぐ専用の手段があるなら全然かまわないのだけれど。
  Cと比べてC++の大きな長所であるのと、実際に使う人がいることから、使うメリットはあるのだろう。・・・そうなると前提や認識が間違っていたんだろうな。もうちょっと本をしっかり読んできます。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前

Re: 多重定義

投稿記事 by h2so5 » 12年前

テンプレートはマクロの一種なので、クラスや関数の中にある型の指定を置換してくれるだけです。
すべての型のオーバーロードを勝手に用意するわけではありません。

「その関数が扱うべきでない型」についてですが、例えば「テンプレート関数内で呼び出されるメソッド」を持っていないクラスをテンプレート引数に指定した場合はコンパイルエラーになるだけです。

zxc
記事: 79
登録日時: 13年前
住所: 日本の背骨(?)あたり

Re: 多重定義

投稿記事 by zxc » 12年前

  分かりました。ありがとうございます。