У меня есть шаблонный класс Cache, в нем есть такие методы, как Get, Put, Evict и CacheEvictStrategy (FIFO, LRU, LFU).
Код: Выделить всё
template
class Cache
template
void Cache::Get(uint32_t num_query, KeyType* queries, ElemType* result, bool* find_mask){
}
Поскольку три типа CacheEvictStrategy имеют много общего кода, я пишу наиболее распространенный код в Cache::Get, он будет вызывать другую шаблонную функцию GetInternal, которая будет действовать по-другому в соответствии с различными стратегиями CacheEvictStrategy.
Код: Выделить всё
template
__global__ void GetInternal(uint32_t num_query, KeyType* queries, ElemType* result, bool* find_mask)
template
void Cache::Get(uint32_t num_query, KeyType* queries, ElemType* result, bool* find_mask){
// common logic
GetInternal(num_query,queries,result,find_mask);
}
Поскольку стратегия определяется во время выполнения. Я хочу написать макрос для его отправки. Но у меня также есть функции Put, Evict, я хочу написать марку, которая принимает функцию и CacheEvictStrategy. Но только я знаю CacheEvictStrategy, могу ли я получить функция шаблона, поскольку CacheEvictStrategy является параметром шаблона. Я не хочу писать макрос для каждой функции, как показано ниже:
Код: Выделить всё
#define DISPATCH_GET(strategy,grid,block,...){ \
switch(strategy){
case LRU:
GetInternal(__VA__ARGS__) \
.... \
} \
#define DISPATCH_PUT
#define DISPATCH_EVICT
Есть ли способы решить мою проблему? Буду признателен, если кто-нибудь даст мне совет
Подробнее здесь:
https://stackoverflow.com/questions/781 ... e-paramete