模板函数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
...
我担心的是从模板创建实例函数的地方:它看起来像堆栈一样,但在我用来测试它的其他代码中,我试图锤击堆栈,{{ 1}}继续前进。我可以安全地使用这样的模板吗?
答案 0 :(得分:1)
据我所知,是的。扩展模板功能与普通功能相同;在您的示例中,fCompare&lt; int&gt;将与名为fCompare_int的独立函数相同,用int替换模板参数。因为你实际上只是在函数调用中获取地址,所以一切都很好。
答案 1 :(得分:1)
fCompare<int>
是在编译时创建的,作为代码段的一部分。您可以将其视为一种常量静态数据,就像文件范围内的const int
一样。因此,每次调用SetCompareFunction
时,它都会收到指向相同函数的指针。因此,无论你调用它多少次,它都不会消耗任何额外的内存,并且你不会因为这样做而耗尽堆栈或堆空间。
这样做的必然结果是模板函数参数必须始终是可以在编译时计算的东西。传递变量(模板变量除外)作为模板参数是非法的。