【问题标题】:How to initialize static member of a template overloaded class如何初始化模板重载类的静态成员
【发布时间】:2021-07-15 08:28:15
【问题描述】:

当模板参数派生自特定基类时,我有一个只有静态成员 list 的类,如果该参数不是从基类派生的,则程序不应该 strong> 编译,因为静态成员不存在。

我现在遇到的问题是我不知道如何初始化list

这是代码:

#include <type_traits>

template<typename T, size_t MaxSubscribers_>
struct Event
{
    using Args_T = T;
    static constexpr size_t MaxSubscribers = MaxSubscribers_;
};

class EventManager
{
public:
    template<typename T, size_t MaxSubscribers>
    struct subscriberMap
    {
        template<typename E, typename Valid = void>
        struct events {};

        template<typename E>
        struct events<E, typename std::enable_if<std::is_base_of<Event<T, MaxSubscribers>, E>::value>::type>
        {
            static typename E::Args_T list[E::MaxSubscribers];
        };
    };
};

// my attempt, does not compile because list doesn't exsist
template<typename T, size_t MaxSubscribers>
template<typename E, typename Valid>
typename E::Args_T EventManager::subscriberMap<T, MaxSubscribers>::events<E, Valid>::list[E::MaxSubscribers];

【问题讨论】:

    标签: c++11 initialization static-members


    【解决方案1】:

    解决方案是您必须重复定义中的确切模板参数列表。

    template<typename T, size_t MaxSubscribers>
    template<typename E>
    typename E::Args_T EventManager::subscriberMap<T, MaxSubscribers>::events<E, typename std::enable_if<std::is_base_of<Event<T, MaxSubscribers>, E>::value>::type>::list[E::MaxSubscribers];
    

    【讨论】:

      【解决方案2】:

      从 c++17 开始,您可以内联声明静态成员:

      static inline typename E::Args_T list[E::MaxSubscribers]{};
      //     ^^^^^^                                           ^^
      //                                         maybe a meaningful default value
      

      【讨论】:

      • 我不能使用c++17的特性,所以我添加了c++11标签
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-10
      • 1970-01-01
      • 2011-03-14
      • 1970-01-01
      • 2021-10-21
      • 2019-05-03
      相关资源
      最近更新 更多