C++ 是否可以将函数参数存储为某种列表
我有一个基础班C++ 是否可以将函数参数存储为某种列表,c++,function,parameters,template-classes,C++,Function,Parameters,Template Classes,我有一个基础班 template<class T> class Base { public: Base(T foo = T()) { for(int i = 0; i < 10; i++) foos.push_back(foo); } private: std::vector<T> foos; } 但由于这是一个模板类,我需要该列表能够适应T需要的任何类型或数量的参数。有没有一种方法可以做到
template<class T>
class Base
{
public:
Base(T foo = T())
{
for(int i = 0; i < 10; i++)
foos.push_back(foo);
}
private:
std::vector<T> foos;
}
但由于这是一个模板类,我需要该列表能够适应T需要的任何类型或数量的参数。有没有一种方法可以做到这一点,或者你知道有更好的方法可以做到我想做的事情吗?一个模板类可以有一个进一步的模板构造函数。在您的情况下,您需要一个接受参数包并执行非完美转发的:
template<class T>
class Base
{
std::vector<T> foos;
public:
template<typename... Args>
Base(Args&&... args)
{
foos.reserve(10);
for(int i = 0; i < 10; i++)
foos.emplace_back(args...);
}
};
这应该可以做到。只需将参数传递给派生类构造函数中的Base构造函数
我强调非完美转发的原因是,如果我们将参数std::转发到插入的第一项中,它可能会移动它们,从而使它们在第二项中无效。YMMV,你应该仔细考虑。
模板类可以有一个进一步模板化的构造函数。在您的情况下,您需要一个接受参数包并执行非完美转发的:
template<class T>
class Base
{
std::vector<T> foos;
public:
template<typename... Args>
Base(Args&&... args)
{
foos.reserve(10);
for(int i = 0; i < 10; i++)
foos.emplace_back(args...);
}
};
这应该可以做到。只需将参数传递给派生类构造函数中的Base构造函数
我强调非完美转发的原因是,如果我们将参数std::转发到插入的第一项中,它可能会移动它们,从而使它们在第二项中无效。YMMV,你应该仔细考虑这个问题。 C++ 11接受。您可以指定标准的c++c++11。您可以指定标准的c++哇,非常感谢!它就像一个符咒!你能给我这样的初学者解释一下最后一段吗;我不太明白转发是什么,只是它与l-和右值有关?@po0l-调用reserve是为了从一开始就有10个元素的空间。这样,当我们插入时,向量不必重新分配所有内容。我的最后一段论述了这个问题。恐怕这个话题太宽了,不能在评论中提出来。这也与你的直接问题无关。好吧,无论如何,谢谢你。你说得对,我的问题不需要马上解决,但我就是这样,我想了解我还不了解的事情;。我要上网看看!哇,非常感谢!它就像一个符咒!你能给我这样的初学者解释一下最后一段吗;我不太明白转发是什么,只是它与l-和右值有关?@po0l-调用reserve是为了从一开始就有10个元素的空间。这样,当我们插入时,向量不必重新分配所有内容。我的最后一段论述了这个问题。恐怕这个话题太宽了,不能在评论中提出来。这也与你的直接问题无关。好吧,无论如何,谢谢你。你说得对,我的问题不需要马上解决,但我就是这样,我想了解我还不了解的事情;。我要上网看看!
template<class T>
class Base
{
std::vector<T> foos;
public:
template<typename... Args>
Base(Args&&... args)
{
foos.reserve(10);
for(int i = 0; i < 10; i++)
foos.emplace_back(args...);
}
};