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
    ...   

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

4

2 に答える 2

1

私が知る限り、はい。拡張テンプレート関数は通常の関数と同じです。あなたの例では、fCompare<int> は fCompare_int と呼ばれる独立した関数と同じで、int がテンプレート パラメーターに置き換えられます。関数呼び出しで事実上アドレスを取得しているだけなので、すべて問題ありません。

于 2012-03-11T05:33:46.750 に答える
1

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

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

于 2012-03-11T05:34:16.020 に答える