我有一个像下面这样的函数,它使用一个对象A构造另一个对象B,将B转发到另一个方法。
代码:
static bool ExecuteScriptFunction(CScriptHost* pHost, const std::wstring& strFunctionName, MList* plResult, const MList* plArgs)
{
auto MakeV8 = [&](const MList* pList) -> Local<Value>
{
Local<Value> var;
CreateJSObjectFromCPPObject(pHost->GetIsolate(), pList, var);
return var;
}
Local<Value> value = pHost->InvokeFunction(strFunctionName.c_str(), MakeV8(plArgs));
// Snip //
}
我想重载该函数,以便我可以传递一个可变数量的plArgs
来传递给InvokeFunction - 我需要通过MakeV8来做它。
为了达到这个目的,std :: forward似乎是一个可能的工具,因为它意味着不依赖于不太现代的va_ *宏,并且通常更清晰的代码,并且还学习了一些关于STL的一部分我以前真的不需要使用。
我认为这样的重载看起来像下面这样,但是,我不确定我所写的内容的行为,或者它是否实现了我的想法,或者它是否实现了任何东西!?
// call a javascript function in V8
template <class... Lists /* = MList*/>
static bool ExecuteScriptFunction(CScriptHost* pHost, const std::wstring& strFunctionName, MList* plResult, const Lists* ...args)
{
auto MakeV8 = [&](const MList* pList) -> Local<Value>
{
Local<Value> var;
CreateJSObjectFromCPPObject(pHost->GetIsolate(), pList, var);
return var;
};
// InvokeFunction handily already takes a variable list of Local<Value>s
// I want to pass a ... of Local<Value>s that is generated from ...args || || || || ||
// So far, no squiggly red lines in VS 2015 on this line of code \/ \/ \/ \/ \/
Local<Value> value = pHost->InvokeFunction(strFunctionName.c_str(), std::forward<Local<Value>>(MakeV8(args))...);
// Snip //
}
以下代码行是否达到了我要求的范围?
Local<Value> value = pHost->InvokeFunction(strFunctionName.c_str(), std::forward<Local<Value>>(MakeV8(args))...);
还是有另一种咒语会产生我需要的行为吗?
答案 0 :(得分:1)
您是否尝试过以下操作?
Local<Value> value = pHost->InvokeFunction(strFunctionName.c_str(), MakeV8(args)...);
仅当您的参数类型为std::forward
时才使用T&&
,而指针则不然。如果您需要更多详细信息,请搜索“完美转发”。
为了扩展可变参数包,std::forward
不是必需的,因为函数参数列表已经是扩展参数包的上下文。