使用enable_if决定成员变量的类型
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 t
时t ...
是一个单一仅输入?
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 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我已经完成了您想做的事情,所以我知道您需要什么。要处理单个消息和多种消息类型,请使用
std :: variant&lt; std ::单音频,t ...&gt;
。此外,您使用is_same_v&lt;
是不正确的。您只能使用1种类型,而不使用多种类型。因此,您需要这样的代码:
我的主要代码要复杂得多,而我只是为此提取了一小部分,所以请谨慎使用。
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 ofis_same_v<>
is incorrect. You can only use 1 type, not multiple types there.So you need a code like this:
My main code is much more complex and I just extracted small part for this, so use it with care.