2017-09-06 62 views
-1

我有一個如下的函數,它使用一個對象A構造另一個對象B,將B轉發到另一個方法。從省略號創建std :: forward的列表(...)

代碼:

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

是的,這是可能的。其次,在這裏使用'std :: forward'完成沒有任何用處,無論如何。最後,你的問題中有一些重要的缺失。那將是一個實際的,具體的,具體的問題。 「是否可能」只是一個是/否的問題,答案是一個簡單的「是」。 「你能教育我嗎」不是一個問題。 stackoverflow.com不是教程網站。首先,最重要的是,你需要弄清楚你在這裏問的是什麼。 –

+0

@SamVarshavchik我絕對需要弄清楚如何提出這個問題。我會編輯。 – mynameisnafe

回答

1

您是否嘗試過以下方法?

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

使用的std::forward是僅使用,如果你的參數是T&&型的,這是不符合你的指針的情況。如果您需要更多詳細信息,請搜索「完美轉發」。

爲了擴大可變參數包,std::forward不是必需的,因爲函數參數列表已經是參數包被展開的上下文。

+0

我會放棄。我已經讀過,forward是'static_cast (t)'的包裝,我也讀了一些關於右值引用的內容。我有很多閱讀要做。 – mynameisnafe

+0

是的。無論何時將參數作爲T &&(根據調用上下文可以是T&'和'T &&';這些引用通常被稱爲'forwarding'或'universal'引用),'std ::轉發()'用於保存任何類型的引用時,傳遞給一個函數。 –

+0

啊是的,我還看到邁爾創造了這個詞,並且談到了參考扣除的東西。從字面上購買新的Effective C++吧!感謝您爲我清理那些東西,我覺得我對自己的語法糖產生了興趣 – mynameisnafe