2017-09-06 18 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 // 
} 

私はそれをInvokeFunctionに渡すplArgsの可変量を渡すことができるように、機能をオーバーロードしたい - 私は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)'へのラッパーであることを読んでおり、私はrvalue参照についても少し読んでいます。私は、多くの読書をしています。 – mynameisnafe

+0

はい、そうです。引数を 'T &&'(呼び出しコンテキストに応じて 'T&'と 'T &&'の両方にすることができます;これらの種類の参照は通常 "フォワード"または "ユニバーサル"参照と呼ばれます)、 'std :: forward () 'は、関数に渡されたときに参照の種類を保持するために使用されます。 –

+0

ああ、マイヤー氏がその言葉を作ったと読んだこともあり、参考推論のことについて話していました。文字通り新しいEffective C++を購入しています!私のためにそれをクリアしてくれてありがとう、私は文法的な砂糖の上に自分自身を持っていると思う。 – mynameisnafe

関連する問題