2016-09-30 208 views
1

我正在研究需要多個存儲類的通用緩存的項目。我的基類看起來是這樣的:可變參數模板類 - 可變參數成員函數

template<typename ... Types> 
class VarCache{ 
    template<typename T> 
    using item_type = shared_ptr<holder<T>>; 
    template<typename T> 
    using map_type = map<int64_t,item_type <T>>; 
public: 
    std::tuple<map_type<Types>...> caches; 
}; 

我需要寫功能,將不接受任何參數,但通過調用它的緩存對象,它會反覆地遍歷所有存儲的地圖變種,並藉此在行動(刪除不需要的項目) 。

例子:

我有VarCache<A,B,C> cache和方法prune<T>();其中TA,B,C

和一個通過調用cache.prune_all_variants();我想緩存執行

prune<A>(); 
prune<B>(); 
prune<C>(); 

這可能嗎?

回答

2

您可以使用一些技巧爲參數包的每個元素調用一個函數。下面是一個選項:

void prune_all_variants() { 
    (void)std::initializer_list<int> { 
     (prune<Types>(), 0)... 
    }; 
} 

在C++ 17,這可以簡化以下使用fold expressions到:

void prune_all_variants() { 
    (prune<Types>(), ...); 
} 
+0

謝謝,作品很棒:)。 – semtexzv

1

你可以使用:

void prune_all_variants() 
{ 
    int dummy[] = {0, (prune<Types>(), void(), 0)...}; 
    static_cast<void>(dummy); // avoid warning for unused variable. 
} 

,或者在倍的表達C++ 17:

void prune_all_variants() { 
    (static_cast<void>(prune<Types>()), ...); 
}