【问题标题】:How to capture variadic arguments with lambda and pass them to inner scope如何使用 lambda 捕获可变参数并将它们传递给内部范围
【发布时间】:2020-10-21 19:21:06
【问题描述】:

我有以下结构,可以将 ExampleInterfaceClass 的虚函数绑定到实现 ExampleInterfaceClass 中的虚函数的类:

struct ExampleStruct {
    ExampleInterfaceClass *instance = nullptr;

    ExampleInterfaceClass *(*InstantiateScript)(void);
    void (*DestroyScript)(ExampleStruct *);

    template <typename T> void Bind(void)
    {
        InstantiateScript = []()
        {
            return static_cast<ExampleInterfaceClass *>(new T());
        };

        DestroyScript = [](ExampleStruct *exampleStruct)
        {
            delete exampleStruct->instance;
            exampleStruct->instance = nullptr;
        };
    }
};

现在我想将可变参数从 Bind() 转发到实现接口的类的实例化。我知道我必须将模板更改为以下内容

template <typename T, typename... T_args> void Bind(T_args &&... args)

但是由于 lambda,我无法将可变参数传递给类的实例化。 如果没有 lambda,我想我可以使用以下内容:

return static_cast<ExampleInterfaceClass *>(new T(std::forward<T_args>(args)...));

但是编译器告诉我'args'没有被捕获。

如何捕获可变参数并转发它们?

【问题讨论】:

  • 您是否尝试过使用默认捕获=
  • @SamVarshavchik - 捕获参数,无法再将 lambda 分配给函数指针。
  • @max66 即使是=?那是一个副本。
  • 正确。必须使用std::function
  • @SamVarshavchik 添加答案?

标签: c++ templates lambda


【解决方案1】:

您可以像捕获任何其他参数一样捕获可变参数。但是,必须注意不要按价值捕获它们,因为这会使它们 const 合格。这是一个例子:

#include <utility>

struct L {};
void k(L&& );

template<class... T> void foo(T&&... t)
{
    auto l = [&t...]() { k(std::forward<T>(t)...); };
}

void a()
{
    L l{};
    foo(l); // errror
    foo(L{}); // OK
}

请注意,一旦您开始在 lambda 中捕获(无论如何),它就不能再转换为函数指针,如果您需要对它进行类型擦除,则必须将其存储在 std::function 对象中。

【讨论】:

    猜你喜欢
    • 2020-10-17
    • 1970-01-01
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 1970-01-01
    • 2023-01-20
    相关资源
    最近更新 更多