Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何将参数列表存储到向量?_C++_Templates_Constructor_Variadic Templates_Stdvector_C++17 - Fatal编程技术网

C++ 如何将参数列表存储到向量?

C++ 如何将参数列表存储到向量?,c++,templates,constructor,variadic-templates,stdvector,c++17,C++,Templates,Constructor,Variadic Templates,Stdvector,C++17,如何将可变构造函数参数存储到向量 失败尝试的示例: class Combo { public: template <class... Args> Combo(Args... args) { // this->keys_.push_back(args...); // this->keys_.push_back(args)...; // this->keys_.push_back(std::forward&l

如何将可变构造函数参数存储到向量

失败尝试的示例:

class Combo 
{
public:
   template <class... Args>
   Combo(Args... args) 
   {
      // this->keys_.push_back(args...);

      // this->keys_.push_back(args)...;

      // this->keys_.push_back(std::forward<Args>(args...));

      //for (uint8_t arg : args...)
      //  this->keys_.push_back(arg);

      // ???
   }

private:
   std::vector<uint8_t> keys_;
};
类组合
{
公众:
模板
组合(Args…Args)
{
//此->按键。向后推(args;
//此->按键。推回(args)。。。;
//这->键向后推(std::forward(args…);
//对于(uint8_t arg:args…)
//此->按键。向后推(arg);
// ???
}
私人:
向量键;
};
  • C++11
  • for(auto&&i:{args…})键。向后推(std::move(i));
    
  • C++17
  • (按键。向后推(args),…);
    
  • 哦,对不起,我错过了显而易见的:
  • 模板组合(Args…Args):键{uint8\ut(Args)…}{
    
    您可以编写:

    template <class... Args>
    Combo(Args... args)
    {
        (keys_.push_back(args), ...);
    }
    
    模板
    组合(Args…Args)
    {
    (按键向后推(args),…);
    }
    
    在使用中,您可以

    #include <vector>
    #include <utility> // std::forward
    
    class Combo
    {
    public:
       template <class... Args>
       Combo(Args&&... args) 
       {
          keys_.reserve(sizeof...(Args));  // reserve memory for unwanted reallocation
          (keys_.emplace_back(std::forward<Args>(args)), ...);
       }
    
    private:
       std::vector<uint8_t> keys_;
    };
    
    这将为您提供以下错误

    Combo obj{ 1, 2, 3, 4.f };
    //                  ^^^^ --> float
    
    模板
    组合(Args&&…Args):键{std::forward(Args)…}{}
    
    甚至更好

    Combo(std::initializer_list<uint8_t> keys): keys_(keys) {}
    
    Combo(std::initializer\u list keys):keys\u(keys){}
    
    不要让生活变得更艰难。我不确定解决方案1是否适用于完美转发,使用
    std::forward
    意味着这一点。@FrançoisAndrieux你认为完美转发在哪里?老实说,我把另一个答案和这个问题混淆了。但仍然需要注意的是,第一种解决方案不是通用的解决方案,因为它不允许完美的转发或仅移动类型;(无效)温度或只是
    键={args…}仅供C++使用17@Jarod42问题不是用特定的C++标准来标记的,所以假设最新的是好的。为什么不只是<代码>键= {ARGS…};<代码>?我想编译器会对它进行优化。我喜欢这个
    movabsrax,578437695752307201
    :)我想推送
    1,2,3,4,
    ,编译器只生成了四条移动指令<代码>578437695752307201
    0x…04030201
    是十六进制。这看起来不错
    ={}
    基本上是bipll在第三个选项下建议的,我认为它不值得单独回答。我对两个答案都投了赞成票
    template<typename... Args>
    Combo(Args &&... args): keys_ { std::forward<Args>(args)... } {}
    
    Combo(std::initializer_list<uint8_t> keys): keys_(keys) {}