2012-03-11 7 views
0

以下のテンプレート機能fCompare()の使用は正しいですか?テンプレート関数はどのように/どこに割り当てられていますか?

//ヘッダ

template<typename _T > class SomeClass 
{ 
    typedef int (*COMPAREFUNC)(_T*,_T*); 
    COMPAREFUNC Compare; 
public: 
    void SetCompareFunction(COMPAREFUNC pfC) { Compare=pfC; } 
    ... 
}; 

template<typename _T > int fCompare(_T *pO, _T *pN) 
{ 
    if (pN==NULL) throw (const char*)"Null not allowed"; 
    if (pO!=NULL) return (*pO > *pN)?1:(*pO < *pN)?(-1):0; 
    return 0; 
} 

//コード

SomeClass<int> aC; 

    aC.SetCompareFunction(fCompare<int>); //    <******* here 
    ... 

インスタンス関数はテンプレートから作成された場合私の心配はある:それはは、スタックのように見えますが、他のコードでIそれをテストするために使用された、私はスタックをハンマーしようとしたと、Compare()はちょうど行くことを続けた。このようなテンプレートを安全に使用できますか?

+1

申し訳ありませんが、「スタックを叩く」とはどういう意味ですか? C++のテンプレートは通常、通常の関数に展開されるため、そのように動作する必要があります。あなたがプログラムを破壊しようとしたことを知らずに、私はどれくらい助けることができないのか分かりません。 – templatetypedef

+0

@templatetypedef:私は元のCプログラマなので、関数の引数として渡されたものはスタックに格納されています。C++では必ずしもそうではありません。 – slashmais

+0

@slashmaisは完全に実装に依存します。 –

答えて

1

fCompare<int>は、コードセグメントの一部としてコンパイル時に作成されます。ファイルスコープでconst intがそうであるように、それを一種の一定の静的データと考えることができます。したがって、SetCompareFunctionを呼び出すたびに、同じ関数のへのポインタを受け取ります。したがって、何度も呼び出すにしても、余分なメモリを使い切ることはなく、単にスタックやヒープスペースが使い果たされることはありません。

これは、テンプレート関数の引数は常にコンパイル時に計算できるものでなければならないということです。変数(テンプレート変数を除く)をテンプレートパラメータとして渡すのは不正です。

+0

それは速かった;)ありがとう。 – slashmais

1

私が言う限り、はい。拡張されたテンプレート関数は、通常の関数と同じです。あなたの例では、fCompare <int>は、fCompare_intという独立した関数と同じで、テンプレートパラメータの代わりにintを使用します。あなたは事実上、関数呼び出しでアドレスを取っているだけなので、すべてが良いです。

関連する問題