шаблонные функции с разным количеством аргументов - PullRequest
1 голос
/ 18 января 2012

Есть класс с тремя шаблонами.

#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);

Как видите, количество аргументов для одного из шаблонов отличается от других.

Теперь в Cache () есть функция, которая вызывает 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() передаются только три аргумента. Так может кто-нибудь объяснить, как эта функция скомпилирована без проблем?

Ответы [ 2 ]

3 голосов
/ 18 января 2012

Хорошо компилируется, потому что используется значение по умолчанию для 4-го числа:

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);
0 голосов
/ 18 января 2012

В C ++ и большинстве других языков программирования вам разрешено устанавливать значение по умолчанию для аргументов функции. В частности, в C ++ вы можете даже предоставить аргументы шаблона по умолчанию для ваших шаблонизированных классов.

Общее правило состоит в том, что аргументы по умолчанию идут в конце. Вы должны поместить параметры с аргументами по умолчанию последними в вашем списке аргументов. У вас может быть любое количество параметров с аргументами по умолчанию - на ваше усмотрение ваша функция может иметь 10 параметров, каждый со значением по умолчанию.

Если бы это было так, ваша функция с 10 аргументами могла бы быть вызвана без передачи каких-либо аргументов - потому что для всех интенсивных целей функция будет действовать так, как если бы вы вызывали ее со значениями, указанными в качестве значений по умолчанию.

Вы используете это больше, чем вы думаете. Для более сложного примера ассоциативные контейнеры STL (например, std :: set) имеют порядок. Они предоставляют «стандартный шаблонный аргумент» std :: less <>, говоря, что «элементы в этом контейнере должны быть отсортированы с использованием их <оператора». Они также предоставляют другой аргумент шаблона по умолчанию для распределителя, который определяет их интерфейс управления памятью. </p>

Они полностью скрыты от вас, если вы не решите изменить их, «переопределив» аргументы по умолчанию. Именно поэтому вы можете создать набор с std::set<DataType>, когда реальный тип будет выглядеть как std::set<Key, Compare, Allocator<Key> >;.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...