gpt4 book ai didi

c++ - 通过枚举重载模板化成员函数

转载 作者:行者123 更新时间:2023-11-28 02:06:48 26 4
gpt4 key购买 nike

假设我有一个 EventHandle 类,它由 READWRITESIGNAL 唯一枚举,并且我正在实现一个成员模板,它应该针对不同的枚举返回不同的数据类型。

enum class EventType {
READ,
WRITE,
SIGNAL
};

class EventHandle {

public:

template <EventType type, typename = enable_if_t<is_same<type, READ>::value>>
ReadEventHandle* cast () { return static_cast<ReadEventHandle>(this); }

template <EventType type, typename = enable_if_t<is_same<type, WRITE>::value>>
WriteEventHandle* cast () { return static_cast<WriteEventHandle>(this); }

template <EventType type, typename = enable_if_t<is_same<type, SIGNAL>::value>>
SignalEventHandle* cast () { return static_cast<SignalEventHandle>(this); }
};

我从 EventHandle 派生了三个类。

class ReadEventHandle : public EventHandle {...}
class WriteEventHandle : public EventHandle {...}
class SignalEventHandle : public EventHandle {...}

显然我写的东西不能编译。有什么方法可以在“编译”时实现这种类型转换重载(例如,不打开枚举)?

最佳答案

具有某些特征和特化的替代方案:

enum class EventType {
READ,
WRITE,
SIGNAL
};

class ReadEventHandle;
class WriteEventHandle;
class SignalEventHandle;

template <EventType E> struct EventHandleType;

template <> struct EventHandleType<EventType::READ> { using type = ReadEventHandle; };
template <> struct EventHandleType<EventType::WRITE> { using type = WriteEventHandle; };
template <> struct EventHandleType<EventType::SIGNAL> { using type = SignalEventHandle; };

然后:

class EventHandle {
public:

template <EventType E>
typename EventHandleType<E>::type* cast();
};

template <EventType E>
typename EventHandleType<E>::type*
EventHandle::cast() { return static_cast<typename EventHandleType<E>::type*>(this); }

Demo

关于c++ - 通过枚举重载模板化成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37147624/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com