有一个具有三个模板的类。
#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这些模板具有共同的功能:
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()
template<class TagStore>
bool Cache<TagStore>::access(PacketPtr pkt, BlkType *&blk, int &lat, PacketList &writebacks)
{
...
blk = tags->accessBlock(pkt->getAddr(), lat, id);
...
}在配置文件中,定义了所有模板
#define USE_CACHE_LRU 1
#define USE_CACHE_FALRU 1
#define USE_CACHE_IIC 1 我想知道这个文件是如何编译的。如您所见,FALRUBlk::accessBlock()接受4个参数。然而,在Cache::access()中,只传递了三个参数。那么,谁能解释一下这个函数是如何编译而没有问题的呢?
发布于 2012-01-19 01:39:11
它编译得很好,因为使用了第四个的默认值:
FALRUBlk* accessBlock(Addr addr, int &lat, int context_src, int *inCache = 0);其他2个只有3个参数:
IICTag* accessBlock(Addr addr, int &lat, int context_src);
BlkType* accessBlock(Addr addr, int &lat, int context_src);因此,您始终可以像示例中那样调用该方法:
blk = tags->accessBlock(pkt->getAddr(), lat, id);发布于 2012-01-19 01:47:15
在C++和大多数其他编程语言中,允许为函数的参数设置默认值。特别是在C++中,您甚至可以为模板化的类提供默认的模板参数。
一般规则是默认参数放在末尾。必须将带有默认参数的参数放在参数列表的最后。你可以有任意数量的带有默认参数的参数--只要你关心,你的函数可以有10个参数,每个参数都有一个默认值。
如果是这种情况,那么可以在不传入任何参数的情况下调用您的10参数函数-因为对于所有密集的目的,该函数的行为就像您使用指定为默认值的值调用它一样。
您可能比您想象的更多地使用它。举个稍微复杂一点的例子,STL关联容器(如std::set)有排序。它们提供了一个std::less<>的“默认模板参数”,表示“这个容器中的项必须使用它们的<运算符进行排序”。它们还为分配器提供了另一个默认模板参数,用于定义它们的内存管理接口。
除非您决定通过“覆盖”默认参数来更改它们,否则这些参数对您是完全隐藏的,这就是为什么当真正的类型看起来更像std::set<Key, Compare, Allocator<Key> >;时,您可以只使用std::set<DataType>创建一个集。
https://stackoverflow.com/questions/8914655
复制相似问题