[英]Using enable_if to decide the type of a member variable
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
,因为在这种情况下无论如何它都是无用的。 当T...
仅是单一类型时,如何使用enable_if
创建T
类型的m_data
?
我已经做了你想做的事,所以我知道你需要什么。 要同时处理单个消息和多个消息类型,请使用std::variant<std::monostate, T...>
。 此外,您对is_same_v<>
的使用不正确。 您只能使用一种类型,而不是多种类型。
所以你需要这样的代码:
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> || ...);
}
};
我的主要代码要复杂得多,我只是为此提取了一小部分,因此请谨慎使用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.