使用enable_if决定成员变量的类型

发布于 2025-02-07 02:10:31 字数 1114 浏览 1 评论 0原文

template <typename ...T>
class BaseEvent
{
    BaseEvent(const unsigned int index, const uint8_t id, const std::variant<T...> data) : m_index(index), m_id(id), m_data(m_data){};
    virtual ~BaseEvent();

    template <typename V>
    const V get()
    {
        static_assert(constexpr std::is_same_v<V, T...>);
        return std::get<V>(m_data);
    };

protected:
    unsigned int m_index;
    uint8_t m_id;
    std::variant<T...> m_data;
    
    // pseudocode:
    // enable_if(sizeof(T...) > 1)
    // then: std::variant<T...> m_data
    // else: T m_data
};

但是,在代码后期,

template <class T>
class StringEvent : public BaseEvent<T>
{
    virtual ~StringEvent();
    const T string() { return get<T>(); };
};

仅将单一类型放到baseevent将无法创建variant,因为无论如何在这种情况下都是无用的。 我如何使用enable_if创建m_data type tt ...是一个单一仅输入?

template <typename ...T>
class BaseEvent
{
    BaseEvent(const unsigned int index, const uint8_t id, const std::variant<T...> data) : m_index(index), m_id(id), m_data(m_data){};
    virtual ~BaseEvent();

    template <typename V>
    const V get()
    {
        static_assert(constexpr std::is_same_v<V, T...>);
        return std::get<V>(m_data);
    };

protected:
    unsigned int m_index;
    uint8_t m_id;
    std::variant<T...> m_data;
    
    // pseudocode:
    // enable_if(sizeof(T...) > 1)
    // then: std::variant<T...> m_data
    // else: T m_data
};

However later in the code,

template <class T>
class StringEvent : public BaseEvent<T>
{
    virtual ~StringEvent();
    const T string() { return get<T>(); };
};

Pasing only a single type to BaseEvent will not be able to create variant as it is useless in that case anyways. How can I use enable_if to create m_data of type T when T... is a single type only?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

只为守护你 2025-02-14 02:10:31

我已经完成了您想做的事情,所以我知道您需要什么。要处理单个消息和多种消息类型,请使用std :: variant&lt; std ::单音频,t ...&gt;。此外,您使用is_same_v&lt;是不正确的。您只能使用1种类型,而不使用多种类型。

因此,您需要这样的代码:

template <typename ...T>
class BaseEvent
{
    BaseEvent(const unsigned int index, const uint8_t id, const std::variant<T...> data) : m_index(index), m_id(id), m_data(m_data){}; 
    // ^-- There is a small bug here in creating variant(different types). you need to solve, and use in-place for variant.
    virtual ~BaseEvent();

    template <typename V>
    const V get()
    {
        static_assert(is_valid_type<V>() || std::is_same_v<V, std::monostate>);
        return std::get<V>(m_data);
    };

protected:
    unsigned int m_index;
    uint8_t m_id;
    std::variant<std::monostate, T...> m_data;

private:
    template<typename U>
    constexpr static bool is_valid_type() {
        return (std::is_same_v<U, T> || ...);
    }    
};

我的主要代码要复杂得多,而我只是为此提取了一小部分,所以请谨慎使用。

I have done exactly what you want to do, so I know what you need. To handle both single message and multiple message types, use std::variant<std::monostate, T...>. In addition, your use of is_same_v<> is incorrect. You can only use 1 type, not multiple types there.

So you need a code like this:

template <typename ...T>
class BaseEvent
{
    BaseEvent(const unsigned int index, const uint8_t id, const std::variant<T...> data) : m_index(index), m_id(id), m_data(m_data){}; 
    // ^-- There is a small bug here in creating variant(different types). you need to solve, and use in-place for variant.
    virtual ~BaseEvent();

    template <typename V>
    const V get()
    {
        static_assert(is_valid_type<V>() || std::is_same_v<V, std::monostate>);
        return std::get<V>(m_data);
    };

protected:
    unsigned int m_index;
    uint8_t m_id;
    std::variant<std::monostate, T...> m_data;

private:
    template<typename U>
    constexpr static bool is_valid_type() {
        return (std::is_same_v<U, T> || ...);
    }    
};

My main code is much more complex and I just extracted small part for this, so use it with care.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文