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

时间:2016-05-10 19:46:28

标签: c++ templates sfinae

假设我有一个由EventHandleREADWRITE唯一枚举的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;上实现这种类型的转换过载。时间(例如,没有开启枚举)?

2 个答案:

答案 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); }

Demo