微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何初始化模板重载类的静态成员

如何解决如何初始化模板重载类的静态成员

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

我现在遇到的问题是我不知道如何初始化 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];

解决方法

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

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

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。