【问题标题】:Store parameter pack as tuple references将参数包存储为元组引用
【发布时间】:2019-02-21 21:08:03
【问题描述】:

我正在尝试存储可变参数模板的左值引用的参数包以供以后使用。

我现在有以下工作。

template <typename... Ts>
class Foo {
private:
        std::tuple<Ts...> m_args;
public:
       template<typename... Args>
       Foo(Args&&... args) : m_args(std::make_tuple(std::forward<Args>(args)...))
       {
       }
 };

 int main() {
     int x = 10;
     int y = 20;
     Foo<int, int> foo(x, y);
 }

但是,我想将参数包存储为引用,以便以后可以访问同一个对象。 我不确定我该怎么做。任何帮助将不胜感激。

【问题讨论】:

    标签: c++11 tuples variadic-templates variadic-functions perfect-forwarding


    【解决方案1】:

    我能想象的最好的就是使用std::forward_as_tuple

    不幸的是,我没有看到一种将其与完美转发一起使用的方法:如果您想在类中的元组中注册值,则必须一次性确定元组的类型。

    我能想象的最好的就是一个 const 引用的元组;如下

    template <typename ... Ts>
    class Foo
     {
       private:
          std::tuple<Ts const & ...> m_args;
    
       public:
          Foo (Ts const & ... as) : m_args{std::forward_as_tuple(as...)}
           { }
     };
    

    我希望没有必要记住你对于基于引用元组的解决方案来说,悬空引用是多么危险。

    【讨论】:

    • 类型是已知的,只有参数的数量会发生变化。
    • @ZincFur - 你的意思是所有Ts... 类型都是同一个类型吗?那你为什么用std::tuple而不是std::array呢?
    • 我不想动态初始化,也不想将 args 的数量指定为模板参数。是否还可以使用std::array来存储参数包?
    • @ZincFur - 使用 SFINAE 来强制 Args... 类型名的数量正好是 std::array 的大小怎么样?而且,是的,您可以使用std::array 来存储参数包(如果m_argsstd::array&lt;T, Dim&gt;,您可以编写Foo (Args const &amp; ... as) : m_args{{ as... }}),但不幸的是,您不能创建引用数组。
    猜你喜欢
    • 2023-02-26
    • 2023-03-09
    • 1970-01-01
    • 2021-07-04
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多