c++ - 确定可变模板参数是编译时间

标签 c++ templates variadic-templates

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

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

是否有一种简洁的方法来确定传递给采用可变参数的模板的参数?

最佳答案

基本上,您想要附加可选列表。为此,您首先需要添加列表:

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

关于c++ - 确定可变模板参数是编译时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74392924/

相关文章:

c++ - 当套接字中发送速度太快时连接缓冲区

templates - 使用 api 获取 wiki 页面的模板数据

c++ - 如何编写没有参数包的可变参数函数?

c++ - 使用模板化模板的多重继承

c++ - 类函数指针作为静态函数中的参数

c++ - 如何使用 Openthread 库编写一个简单的应用程序

c++ - 用模板参数除以零

c++ - 当我使用模板时,编译器无法将函数的返回类型从 double 转换为 int

C++:获取 std::bind 产生的参数

c++ - 专门模板类的 friend (C++)