【发布时间】:2015-06-25 10:17:27
【问题描述】:
这是我想要实现的示例设计代码。基本上我想为不同的 handlerNames 存储处理函数,这些处理函数可以是可变参数。
处理函数应该在事件上被调用,需要的参数通过 Script::Handle(...) 传递
我怎样才能做到这一点?也许它可以使用可变参数模板?
class Script
{
public:
Script() { /* ... */ }
template<typename TFunction>
void AddHandler(const char *handlerName, TFunction &&function)
{
_handlerMap[handlerName] = std::move(function);
}
void Handle(const char *handlerName, ...)
{
_handlerMap[handlerName](...);
}
private:
typedef std::map<std::string, std::function<void()>> HandlerMapType;
HandlerMapType _handlerMap;
};
//Handler functions
handlerOne() { std::cerr << "One"; }
handlerTwo(std::string a1, int a2) { std::cerr << "Two"; }
handlerThree(bool a1) { std::cerr << "Three"; }
int main(int argc, char **argv)
{
Script script;
script.AddHandler("One", std::bind(&handlerOne));
script.AddHandler("Two", std::bind(&handlerTwo));
script.AddHandler("Three", std::bind(&handlerThree));
script.Handle("One");
script.Handle("Two, "string", 96);
script.Handle("Three", true);
script.Handle("Three", "what should happen here?"); //String passed instead of bool
}
【问题讨论】:
-
类型擦除。有多种方法可以做到这一点;选择你的毒药。这是一个很好的开始阅读它akrzemi1.wordpress.com/2013/11/18/type-erasure-part-i
标签: c++