Tas*_*kie 7 c++ variadic-functions template-templates variadic-templates c++11
是否有一种直接的方法来获得可变参数的可变参数模板模板参数.例如,考虑以下函数签名
template<template<typename,size_t...> class Pack,
typename T, size_t ... Args>
void foo(const Pack<T,Args...>& a);
Run Code Online (Sandbox Code Playgroud)
如果我们想要传递两个Packs,我们现在必须做一个重载
template<template<typename,size_t...> class Pack,
typename T, size_t ... Args0, size_t ... Args1>
void foo(const Pack<T,Args0...>& a, const Pack<T,Args1...>& b);
Run Code Online (Sandbox Code Playgroud)
现在如果我们想要传递Pack具有不同可变参数的可变数量的对象,例如Args0...,Args1...,Args2....
所以我在想是否有一种切实可行的做法(以下是草图表示).
template<template<typename,size_t...> ... class Pack, typename T,...>
void foo(const Pack<T,...> ... packs);
Run Code Online (Sandbox Code Playgroud)
我只想使用普通的可变参数模板:
template<typename... Ts>
void foo(const Ts&... packs) {
}
Run Code Online (Sandbox Code Playgroud)
然后写一个特征来提取类型和size_ts.您可以轻松添加一些帮助程序别名模板来执行您喜欢的任何操作.
template <typename T> struct extract_args;
template <template <typename, size_t...> class Pack, typename T, size_t... Args>
struct extract_args<Pack<T,Args...>> {
using type = T;
using args = std::index_sequence<Args...>;
};
Run Code Online (Sandbox Code Playgroud)
然后在foo你内部可以提取参数并随意使用它们.例如,要从包中获取std::tuple包含所有Ts的内容:
using all_ts = std::tuple<typename extract_args<Ts>::type...>;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1112 次 |
| 最近记录: |