如何从参数包构造引用的std :: tuple?

Nat*_*mal 0 c++ variadic-templates stdtuple c++17

我有一个构建器类,我想将参数存储为引用,以便在后续构建中使用。

我想将可变数量的参数传递给我的类,使用类模板参数推导来推断模板参数,并将这些传递的参数作为引用存储在std :: tuple中。

从参数包转换为引用的std :: tuple的最简单方法是什么?

我发现std :: forward_as_tuple的功能与我想要的类似,但是我不想要转发引用,而且它在成员元组的初始化期间提供了语法错误。

template <typename... Ts>
struct Builder
{
using ArgsT = decltype(std::forward_as_tuple(Ts{}...));

ArgsT args_;

Builder(Ts&... ts) : args_(ts...) {}
};

int main()
{
    struct Foo
    {
        int a;
        double b;
    };

    Foo foo{};
    Builder fooBuilder{foo.a, foo.b};
}
Run Code Online (Sandbox Code Playgroud)

语法错误是:

错误:没有匹配的调用函数 std::tuple<int&&, double&&>::tuple(int&, double&)

Jar*_*d42 5

如果您只想参考,请直接使用它们:

template <typename... Ts>
struct Builder
{
    using ArgsT = std::tuple<Ts&...>;

    ArgsT args_;

    Builder(Ts&... ts) : args_(ts...) {}
};

int main()
{
    struct Foo
    {
        int a;
        double b;
    };

    Foo foo{};
    Builder fooBuilder{foo.a, foo.b};
}
Run Code Online (Sandbox Code Playgroud)

对于您的代码:

decltype(std::forward_as_tuple(Ts{}...))解决std::tuple<Ts&&...>
Ts{}创建一个临时文件(并要求您的类型是默认可构造的)。

而且您无法绑定int&int&&

您可以在中使用decltype(std::forward_as_tuple(std::declval<Ts&>()...))哪个解析std::tuple<Ts&...>,但稍后会提供更简单的解决方案;-)。