从省略号(...)

时间:2017-09-06 10:39:04

标签: c++ std perfect-forwarding

我有一个像下面这样的函数,它使用一个对象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))...);

还是有另一种咒语会产生我需要的行为吗?

1 个答案:

答案 0 :(得分:1)

您是否尝试过以下操作?

Local<Value> value = pHost->InvokeFunction(strFunctionName.c_str(), MakeV8(args)...);

仅当您的参数类型为std::forward时才使用T&&,而指针则不然。如果您需要更多详细信息,请搜索“完美转发”。

为了扩展可变参数包,std::forward不是必需的,因为函数参数列表已经是扩展参数包的上下文。