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);
// ???
}
私人:
向量键;
};
for(auto&&i:{args…})键。向后推(std::move(i));
(按键。向后推(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) {}