繁体   English   中英

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

[英]Variadic template class - variadic member function

我正在研究需要通用缓存的多个存储类的项目。 我的基类看起来像这样:

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;
};

我需要编写不接受任何参数的函数,但是通过在缓存对象上调用它,它将迭代遍历所有存储的映射变量,并执行perfrom操作(删除不需要的项)。

例:

我有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中,可以使用折叠表达式将其简化为以下内容:

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中使用fold表达式:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM