0

2D 関数を自動的に補間するクラスがあります (非常に満足しています)。補間されるメソッドへの動的関数ポインターを受け入れます。オブジェクト インスタンスとポインターが必要なため、クラスをテンプレート化する必要がありました。

クラスのテンプレート化を避けることはできますか? それとも、オブジェクト インスタンスをパラメーターとして受け入れるために、そうし続ける必要がありますか? 基本クラスは可能ですか?(私はC ++にかなり慣れていません)

私が持っている方法は(省略)です:

template<class F>
class Interpolate {
   Interpolate(double (F::*f)(double, double), F & obj, ...) { 
      ...
      double value = (object.*f)(x,y);
      ...
   }
}
4

1 に答える 1

1

コメントで指摘されているように、std::function も使用できます。これにより、std::bind の柔軟性が向上します。一方、 std::function は結果の関数をヒープに割り当てる可能性があり、これにより大きなオーバーヘッドが発生します (これは std::cref() を使用することで回避できます)。std::function とテンプレートの実行時間の違いに関する非常に興味深い議論は、std::function vs templateにあります。

" std::function はさまざまなタイプの呼び出し可能なオブジェクトを格納できることに注意してください。したがって、ストレージに対して何らかの型消去マジックを実行する必要があります。一般に、これは動的メモリ割り当てを意味します (デフォルトでは new の呼び出しによる)。これは非常にコストのかかる操作であることはよく知られています. " by Cassio Neri - ここで std::cref が役立つ場所があります。特に、先ほど書いたリンクで説明した例では、std::cref を使用せずに std::cref のヒープ割り当てを行っているためです。 :function はプログラムを 10 分の 1 遅くしました!

于 2013-08-30T16:30:52.743 に答える