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文件范围一样。因此,每次调用SetCompareFunction时,它都会收到指向同一个函数的指针。因此,无论您调用它多少次,它都不会占用任何额外的内存,并且您不会因为这样做而耗尽堆栈或堆空间。

对此的推论是模板函数参数必须始终是可以在编译时计算的东西。将变量(模板变量除外)作为模板参数传入是非法的。

于 2012-03-11T05:34:16.020 回答