【发布时间】:2018-04-29 01:55:49
【问题描述】:
在 C++ 中是否可以根据提供的模板参数的数量定义多个方法?类似于可变参数函数的工作原理?
我可以做的功能
template <class ...Args>
struct VariadicFunctionCallback {
typedef std::function<void(std::shared_ptr<Args>...)> variadic;
};
但我想知道的是,我是否可以做类似的事情,但要创建多个函数而不是多个参数
template <class ...FunctionArg>
class Example {
void Function(FunctionArg)...
}
这将允许我做类似的事情
template <>
class Example<int, float> {
void Function(int i) {
...
}
void Function(float f) {
...
}
}
如果可能的话,与我目前的设置相比有什么优势
template<class EventType>
class EventHandler {
public:
void HandleEvent(const std::shared_ptr<EventType>& event) {
}
};
class ExampleEvent : public Event<ExampleEvent> {
};
class ExampleHandler : public EventHandler<ExampleHandler>, EventHandler<Events::ShutdownEvent> {
public:
void HandleEvent(const std::shared_ptr<ExampleEvent> &event);
void HandleEvent(const std::shared_ptr<Events::ShutdownEvent> &event);
};
--编辑-- 如果这两种解决方案混合在一起,我最终得到了混合。 它可能不是最好的,我会继续尝试并加班改进。
template <class EventType>
class BaseEventHandler {
public:
EventIdentifier GetIdentifier() const {
return EventType::GetIdentifier();
}
virtual void HandleEvent(const std::shared_ptr<EventType> &event) = 0;
};
template<class EventType, class ...EventTypes>
class EventHandler: public BaseEventHandler<EventTypes>... {
};
这让我可以这样做
class EventListener: public EventHandler<ShutdownEvent, MousePosEvent, WindowCloseRequestEvent> {
void HandleEvent(const std::shared_ptr<ShutdownEvent> &event);
void HandleEvent(const std::shared_ptr<MousePosEvent> &event);
void HandleEvent(const std::shared_ptr<WindowCloseRequestEvent> &event);
}
【问题讨论】:
标签: c++ templates variadic-templates c++17 template-specialization