如何确定可变参数模板的参数在编译时确定?

3

假设我想定义一个依赖于某些类型的类型:

    struct TimerPump{};
    struct GuiPump{};
    struct NetworkPump{};
    
    template<class... Pumps>
    class DispatcherT{};
    
    using Dispatcher = DispatcherT< TimerPump, GuiPump, NetworkPump >;

我希望GUI和网络泵可以选择性使用。它们中可能需要一个、两个或者都不需要。我可以写一个预处理器宏:

using Dispatcher = DispatcherT< TimerPump
#ifdef GUI_ENABLED
                                , GuiPump
#endif
#ifdef NETWORK_ENABLED
                                , NetworkPump 
#endif
>;

但我正在寻找通过特性来控制这些参数的方法。

struct Traits
{
    static constexpr bool gui = true;
    static constexpr bool network = false;
};

using Dispatcher = DispatcherT< TimerPump
                                , Traits::gui ? GuiPump : null     <--- need help here
                                , Traits::network ? NetworkPump : null
>;

有没有一种简洁的方法可以确定传递给具有可变参数的模板的参数?
1个回答

5
基本上,您想要可选列表追加。为此,您首先需要列表追加:
template<typename... Ts>
struct list {
    template<typename T>
    using append = list<Ts..., T>;

    template<bool b, typename T>
    using appendIf = std::conditional_t<b, list<Ts..., T>, list<Ts...>>;

    template<template<class...> LT>
    using applyTo = LT<Ts...>;
};

如果您开始使用list<>(或者您确定的任何类型),然后在每个步骤中使用::appendIf<condition, type>,最后以applyTo<DispatcherT>结束。

using Dispatcher = 
    list<TimerPump>
        ::appendIf<Traits::gui, GuiPump>
        ::appendIf<Traits::network, NetworkPump>
        ::applyTo<DispatcherT>;

1
带有测试的实时工作演示(已修复一些重命名和编译问题)。 - Marek R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接