可变参数模板类 - 可变参数成员函数

问题描述:

我正在研究需要多个存储类的通用缓存的项目。我的基类看起来是这样的:可变参数模板类 - 可变参数成员函数

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

这可能吗?

您可以使用一些技巧为参数包的每个元素调用一个函数。下面是一个选项:

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

在C++ 17,这可以简化以下使用fold expressions到:

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

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

你可以使用:

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>()), ...); 
}