可变参数模板类 - 可变参数成员函数
问题描述:
我正在研究需要多个存储类的通用缓存的项目。我的基类看起来是这样的:可变参数模板类 - 可变参数成员函数
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>();
其中T
是A,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>(), ...);
}
答
你可以使用:
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>()), ...);
}
谢谢,作品很棒:)。 – semtexzv