scr*_*cry 8 c++ metaprogramming variadic-templates c++11
我想知道是否可以过滤传递给可变参数模板的类型(基于谓词模板)来生成包含满足谓词的那些类型的另一个可变参数模板:
/** Filter a parameter pack */
template <template <class> class,
template <class...> class,
class...>
struct filter;
template <template <class> class Pred, template <class...> class Variadic>
struct filter<Pred, Variadic> : Variadic<>
{};
template <template <class> class Pred,
template <class...> class Variadic,
class T, class... Ts>
struct filter<Pred, Variadic, T, Ts...>
{
// FIXME: this just stops at first T where Pred<T> is true
using type = typename std::conditional<
Pred<T>::value,
Variadic<T, Ts...>, // can't do: Variadic<T, filter<...>>
filter<Pred, Variadic, Ts...> >::type;
};
Run Code Online (Sandbox Code Playgroud)
如您所见,我还没有找到一种方法从其余的过滤类型中"提取"参数包.
提前致谢!
这应该是相当直截了当的.你应该有这样的东西:
template <typename...> struct filter;
template <> struct filter<> { using type = std::tuple<>; };
template <typename Head, typename ...Tail>
struct filter<Head, Tail...>
{
using type = typename std::conditional<Predicate<Head>::value,
typename Cons<Head, typename filter<Tail...>::type>::type,
typename filter<Tail...>::type
>::type;
};
Run Code Online (Sandbox Code Playgroud)
你只需要Cons<T, Tuple>,果然T, std::tuple<Args...>到std::tuple<T, Args...>了,你需要通过沿谓词(留作练习).Cons可能看起来像这样:
template <typename, typename> struct Cons;
template <typename T, typename ...Args>
struct Cons<T, std::tuple<Args...>>
{
using type = std::tuple<T, Args...>;
};
Run Code Online (Sandbox Code Playgroud)
结果filter<Args...>::type是std::tuple<Brgs...>,Brgs...一个包只包含Args...谓词所包含的那些类型.
| 归档时间: |
|
| 查看次数: |
2249 次 |
| 最近记录: |