首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有不同数目参数的模板函数

具有不同数目参数的模板函数
EN

Stack Overflow用户
提问于 2012-01-19 01:36:57
回答 2查看 1.3K关注 0票数 1

有一个具有三个模板的类。

代码语言:javascript
复制
#if defined(USE_CACHE_FALRU)
template class Cache<FALRU>;
#endif

#if defined(USE_CACHE_IIC)
template class Cache<IIC>;
#endif

#if defined(USE_CACHE_LRU)
template class Cache<LRU>;
#endif

这些模板具有共同的功能:

代码语言:javascript
复制
FALRUBlk* accessBlock(Addr addr, int &lat, int context_src, int *inCache = 0);
IICTag* accessBlock(Addr addr, int &lat, int context_src);
BlkType* accessBlock(Addr addr, int &lat, int context_src);

正如您所看到的,其中一个模板的参数数量与其他模板不同。

现在在缓存()中,有一个函数调用accessBlock()

代码语言:javascript
复制
template<class TagStore>
bool Cache<TagStore>::access(PacketPtr pkt, BlkType *&blk, int &lat, PacketList &writebacks)
{ 
 ...
 blk = tags->accessBlock(pkt->getAddr(), lat, id);
 ...
}

在配置文件中,定义了所有模板

代码语言:javascript
复制
#define USE_CACHE_LRU 1
#define USE_CACHE_FALRU 1
#define USE_CACHE_IIC 1 

我想知道这个文件是如何编译的。如您所见,FALRUBlk::accessBlock()接受4个参数。然而,在Cache::access()中,只传递了三个参数。那么,谁能解释一下这个函数是如何编译而没有问题的呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-19 01:39:11

它编译得很好,因为使用了第四个的默认值:

代码语言:javascript
复制
FALRUBlk* accessBlock(Addr addr, int &lat, int context_src, int *inCache = 0);

其他2个只有3个参数:

代码语言:javascript
复制
IICTag* accessBlock(Addr addr, int &lat, int context_src);
BlkType* accessBlock(Addr addr, int &lat, int context_src);

因此,您始终可以像示例中那样调用该方法:

代码语言:javascript
复制
blk = tags->accessBlock(pkt->getAddr(), lat, id);
票数 3
EN

Stack Overflow用户

发布于 2012-01-19 01:47:15

在C++和大多数其他编程语言中,允许为函数的参数设置默认值。特别是在C++中,您甚至可以为模板化的类提供默认的模板参数。

一般规则是默认参数放在末尾。必须将带有默认参数的参数放在参数列表的最后。你可以有任意数量的带有默认参数的参数--只要你关心,你的函数可以有10个参数,每个参数都有一个默认值。

如果是这种情况,那么可以在不传入任何参数的情况下调用您的10参数函数-因为对于所有密集的目的,该函数的行为就像您使用指定为默认值的值调用它一样。

您可能比您想象的更多地使用它。举个稍微复杂一点的例子,STL关联容器(如std::set)有排序。它们提供了一个std::less<>的“默认模板参数”,表示“这个容器中的项必须使用它们的<运算符进行排序”。它们还为分配器提供了另一个默认模板参数,用于定义它们的内存管理接口。

除非您决定通过“覆盖”默认参数来更改它们,否则这些参数对您是完全隐藏的,这就是为什么当真正的类型看起来更像std::set<Key, Compare, Allocator<Key> >;时,您可以只使用std::set<DataType>创建一个集。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8914655

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档