代码之家  ›  专栏  ›  技术社区  ›  po0l

是否可以将函数参数存储为某种列表

  •  1
  • po0l  · 技术社区  · 8 年前

    我有一个基本类

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

    我有一个派生类

    class Derived : public Base<Bar>
    {
    public:
        Derived() : Base(Bar("somerandomparameter")) {}
    }
    

    我想要做的是创建一个包含10个新条的向量,所有这些条都带有提供的构造函数(不管它是什么)。

    我曾想过创建一个自定义副本构造函数,但这并没有像预期的那样起作用,因为push\u-back方法似乎会创建更多的副本,至少我的 Bar 构造函数get被调用了10多次。

    对我来说,最佳解决方案类似于传递一个参数列表,因为这只是创建我想要的10个对象。

    ...
    Base(ParameterList l)
    {
        for(int i = 0; i < 10; i++)
            foos.push_back(T(l));
    }
    ...
    

    但由于这是一个模板类,我需要该列表能够适应任何类型或数量的参数 T 需要。有什么方法可以做到这一点吗?或者你知道有更好的方法来做我想做的事情吗?

    1 回复  |  直到 8 年前
        1
  •  4
  •   StoryTeller - Unslander Monica    8 年前

    模板类可以具有进一步的模板化构造函数。在您的情况下,您需要一个接受参数包并进行(非完美)转发的:

    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<Bar> 在你的 Derived 类的构造函数。

    我之所以强调非完美转发,是因为我们应该 std::forward 如果参数插入到插入的第一个项中,则可能会移动它们,从而使它们对于第二个项无效。YMMV,你应该仔细考虑。