【发布时间】:2021-05-25 12:40:08
【问题描述】:
我有一个代码,它以 XML 的形式从 flash player 获取消息,将它们解析为函数和参数,并为该函数调用注册的回调。 我要替换的那段代码做得很好(几乎)通用回调机制: code for the generic callback implementation of flashSDK (ASInterface.inl).
问题在于这段代码是为 flash 编写的,我想替换 flash 并使用具有相同接口的其他服务。这种回调机制是否有任何标准实现(std?boost?其他开源的东西?)?
此代码实现了通用回调机制,您可以在映射中注册具有多个参数和类型的函数:
void SomethingHappened(int a, int b) {print a + b;}
void SomethingElseHappened(string abcd) {print abcd;}
callbacks["SomethingHappened"] = &SomethingHappened;
callbacks["SomethingElseHappened"] = &SomethingElseHappened;
然后搜索它并使用参数数组调用:
Callbacks::iterator itCallback = callbacks.find(functionName);
if (itCallback != callbacks.end())
{
HRESULT result = itCallback->second.Call(arguments, returnValue);
}
完整用法示例:
//init callbacks
std::map<std::wstring, Callback> callbacks;
void SomethingHappened(int a, int b) {print a + b;}
void SomethingElseHappened(string abcd) {print abcd;}
callbacks[functionName] = &SomethingHappened;
void MessageArrived(string xmlInput)
{
string functionName = parseFunctionName(xmlInput);
Callbacks::iterator itCallback = callbacks.find(functionName);
if (itCallback != callbacks.end())
{
//parse arguments
std::vector<std::wstring> args;
_Args::split(xml, args);
ASValue::Array arguments;
for (size_t i = 0, s = args.size(); i < s; ++i)
{
ASValue arg; arg.FromXML(args[i]);
arguments.push_back(arg);
}
ASValue returnValue;
//***this is where the magic happens: call the function***
HRESULT result = itCallback->second.Call(arguments, returnValue);
return result;
}
}
【问题讨论】:
-
看来你想要
std::function<HRESULT(ASValue::Array, ASValue&)>。 -
@Jarod42 不,因为我已经拥有以下功能:SomethingHappened、SomethingElseHappened 等等,它们有不同的声明
-
你需要一个包装器来创建
std::function,不是吗? -
什么是
ASValue?某种std::variant<int, string, double, ASValue::Array, ...>? -
我不熟悉 std::variant。虽然 ASValue 保存基本类型数据。请参阅此链接:github.com/cpzhang/bud/blob/…
标签: c++ c++11 templates flash boost