2017-09-06 4 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&&의 경우에만 사용이다. 더 자세한 정보가 필요하면 '완벽한 전달'을 검색하십시오.

variadic 인수 팩을 확장하려면 함수 인수 목록이 이미 매개 변수 팩이 확장 된 컨텍스트이므로 std::forward은 필요하지 않습니다.

+0

나는 그것을 줄 것이다. 나는'static_cast (t)'래퍼를 읽었고 rvalue 참조에 대해서도 약간 읽었다. 나는 할 수있는 많은 책을 가지고있다. – mynameisnafe

+0

예, 그렇습니다. 인수를'T && '(호출 문맥에 따라'T &'와'T &&'둘 다 사용할 수 있습니다; 이러한 종류의 참조는 일반적으로'전달 '또는'보편적 참조 '라고합니다),'std :: forward ()'은 함수에 전달 될 때 어떤 종류의 참조인지를 보존하는 데 사용됩니다. –

+0

아 그래, 나는 또한 마이어가 그 용어를 만들었고 참조 공제 내용에 대해서 이야기했다고 읽었다. 문자 그대로 새로운 Effective C++를 구입했습니다! 나를 위해 그것을 정리해 주셔서 감사합니다, 나는 syntactic 한 설탕 위에 tizz에 넣었다라고 생각한다 – mynameisnafe

관련 문제