【问题标题】:create a list for std::forward from ellipsis (...)从省略号 (...) 为 std::forward 创建一个列表
【发布时间】: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&lt;Value&gt; value = pHost-&gt;InvokeFunction(strFunctionName.c_str(), std::forward&lt;Local&lt;Value&gt;&gt;(MakeV8(args))...);

或者是否有其他咒语会产生我需要的行为?

【问题讨论】:

  • 是的,这是可能的。其次,在这里使用std::forward 绝对没有任何用处。最后,您的问题中缺少一些至关重要的东西。那将是一个实际的、具体的、具体的问题。 “有没有可能”只是一个是/否的问题,答案是一个简单的“是”。 “你能教育我吗”不是问题。 stackoverflow.com 不是教程网站。首先,最重要的是,你需要弄清楚你在这里问的是什么。
  • @SamVarshavchik 我绝对需要弄清楚如何问这个问题。我会编辑。

标签: c++ std perfect-forwarding


【解决方案1】:

您是否尝试过以下方法?

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

std::forward 的使用仅在您的参数是 T&amp;&amp; 类型时使用,而您的指针则不是这种情况。如果您需要更多详细信息,请搜索“完美转发”。

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

【讨论】:

  • 我会试一试的。我读过 forward 是static_cast&lt;T&amp;&amp;&gt;(t) 的包装器,我还读了一些关于右值引用的内容。我有这么很多阅读要做。
  • 是的。每当您将参数设为 T&amp;&amp; 时(根据调用上下文,它可以是 T&amp;T&amp;&amp;;这些类型的引用通常称为“转发”或“通用”引用),std::forward&lt;T&gt;() 是用于在传递给函数时保留任何类型的引用。
  • 啊,是的,我还读到 Meyer 创造了这个词,并谈到了参考扣除的东西。立即购买新的 Effective C++!感谢您为我解决这个问题,我想我让自己对语法糖感到头疼
  • 不客气。如果您的问题得到解决,请考虑投票并接受答案。
  • 原谅我,我被其他愚蠢的事情分心了
猜你喜欢
  • 2013-09-03
  • 2019-04-04
  • 1970-01-01
  • 2017-03-30
  • 2018-09-02
  • 2017-12-28
  • 1970-01-01
  • 2011-03-25
  • 1970-01-01
相关资源
最近更新 更多