假设我有一个由EventHandle
,READ
和WRITE
唯一枚举的SIGNAL
类,我正在实现一个应该返回不同数据类型的成员模板关于不同的枚举。
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 {...}
显然我写的不会编译。有没有办法在&#34;编译&#34;上实现这种类型的转换过载。时间(例如,没有开启枚举)?
答案 0 :(得分:1)
我不能说我完全明白你想要做什么,但你当然没有正确使用SFINAE。这是可编辑的代码,我希望可以作为指导:
=IFERROR(HYPERLINK(VLOOKUP(S.O.P.!$D$3,Models!$C$2:$G$296,4,FALSE), "Click Here to Open Box Label"), "Unable to retrieve part information")
答案 1 :(得分:1)
具有一些特征和专业化的替代方案:
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); }