Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.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++_Function_Parameters_Template Classes - Fatal编程技术网

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...);
    }  
};