【发布时间】:2017-09-06 10:39:04
【问题描述】:
我有一个类似下面的函数,它使用一个对象 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))...);
或者是否有其他咒语会产生我需要的行为?
【问题讨论】:
-
是的,这是可能的。其次,在这里使用
std::forward绝对没有任何用处。最后,您的问题中缺少一些至关重要的东西。那将是一个实际的、具体的、具体的问题。 “有没有可能”只是一个是/否的问题,答案是一个简单的“是”。 “你能教育我吗”不是问题。 stackoverflow.com 不是教程网站。首先,最重要的是,你需要弄清楚你在这里问的是什么。 -
@SamVarshavchik 我绝对需要弄清楚如何问这个问题。我会编辑。
标签: c++ std perfect-forwarding