0

関数テンプレートがfuncあり、同じテンプレート パラメーターで複数回インスタンス化されるとします。同じテンプレート パラメータを持つ個々のインスタンスを (0 から) カウントする必要があり、インスタンス カウントはfuncの実装からアクセスできる必要があります。明らかに、静的メンバーは私が探しているものではありません。代わりに、コンパイル時の型計算でインスタンス カウントを実装する必要があるように見えます。

例 (ユーザー コード):

{
  for(int i=0;i<10;i++) {
    func<float>();           // This should be instance number 0
  }
  func<float>();             // This should be instance number 1
}

実行時ループにもかかわらず、 の最初のインスタンスはfunc番号 0 を取得します。これは、すべてのループ反復でインスタンス番号が変更されるべきではないということです。ループが終了し、関数が再度呼び出された場合にのみ、数値を 1 に増やします。

元のテンプレート:

template<class T> void func() {}

インスタンス数にアクセスするには、次の方法が考えられます。

template<class T,int COUNT> void func() {}   // instance number as template parameter
template<class T> void func(int count) {}    // or as function argument

これは、派手な呼び出しラッパーで行うことができますか? もしそうなら、どのように?

私はそれが不可能であることを恐れています...しかし、今、私はそれをうまく利用しています..

4

3 に答える 3

3

インスタンス化された関数テンプレートは関数です。各関数は、プログラム内で 1 回だけ存在します。したがって、 のインスタンス化は 1 つしかないため、インスタンス化を数えることはできませんfunc<float>

于 2013-02-07T22:55:38.820 に答える
0
template<class T> class impl {
    template<int count>
    static void funcImpl() {}
}

#define func funcImpl<__COUNTER__>

...

impl<float>::func()
于 2013-02-07T23:04:21.300 に答える
0

コメントで説明しているのは、関数の結果をキャッシュしたいということです。これはメモ化と呼ばれます。各テンプレート引数の関数のメモ化を処理するために、おそらく完全なクラスを作成する必要があります。

関数が毎回同じ値に減少すると予想される場合は、コンパイラーがそれを自動的に行うかどうかを最初に確認してください (g++ -S -gあまり読みにくくないはずです...)。

于 2013-02-07T23:34:28.727 に答える