【问题标题】:Push_back variadic function parameters into a vector?Push_back 可变参数函数参数转换成向量?
【发布时间】:2017-04-03 23:10:44
【问题描述】:

我正在尝试 push_back 可变参数函数的参数,如下所示,但编译器说存在类型不匹配(由于参数是通用类型,而向量是 int)。我应该怎么做才能使参数兼容?

vector<int> x;
template<typename... Rest>
void foo(Rest... rest) {
    x.push_back(rest...);
}

【问题讨论】:

    标签: c++ debugging variadic-functions variadic


    【解决方案1】:

    在 C++14 及之前的版本中:

    void foo(Rest... rest) {
        int a[] = {0, (x.push_back(rest), 0)...};
        static_cast<void>(a);  // unused
    }
    

    在 C++17 中:

    void foo(Rest... rest) {
        (x.push_back(rest), ...);
    }
    

    【讨论】:

    • 谢谢! a[] 的目的是什么?
    • 您确定必须从左到右评估那些 push_backs 吗?否则你可能会以混乱的顺序得到物品。
    • @sp2danny:是的。
    【解决方案2】:

    从基本情况开始:

    void push_all(vector<int>&) {}
    

    继续“逐步解包”

    template<typename... Rest>
    void push_all(vector<int>& vec, int val, Rest... rest)
    {
        vec.push_back(val);
        push_all(vec, rest...);
    }
    

    没有那么紧凑,但更容易理解。

    【讨论】:

      【解决方案3】:

      您应该更喜欢这个版本,因为它速度更快并且也适用于 C++11。

      template<typename... Rest>
      void foo(Rest... rest) {
          x.insert(x.end(), { static_cast<decltype(x)::value_type>(rest)...});
      }
      

      但如果你出于某种原因需要使用push_back(),那么至少调用reserve() 以使其更快。

      template<typename... Rest>
      void foo(Rest... rest) {
          x.reserve(sizeof...(Rest));
          (x.push_back(rest), ...);
      }
      

      【讨论】:

      • 这没有提供问题的答案。一旦你有足够的reputation,你就可以comment on any post;相反,provide answers that don't require clarification from the asker。 - From Review
      • @kamshi “这没有提供问题的答案。”请解释...
      • op 询问如何使参数Rest...“兼容”。他可能的意思是如何在向量中存储任意类型,例如使用 std::any。您的解决方案没有解决这个问题,您只关注性能(请参阅此处,它不会为非整数类型编译:godbolt.org/z/9dGPbnoGv),这就是为什么我将您的帖子标记为未回答问题。
      • 对不起,我编辑了我的答案来解决这个问题。谢谢你注意到我的错误。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-21
      • 2019-03-20
      • 1970-01-01
      • 1970-01-01
      • 2021-07-29
      相关资源
      最近更新 更多