【问题标题】:Pass initializer list to constructor?将初始化列表传递给构造函数?
【发布时间】:2021-10-04 01:13:32
【问题描述】:

我已经编写了自己的数组模板类“CArray”,并希望将 { 1, 2, 3 } 之类的内容传递给它的一个构造函数,以便我可以创建一个数组类实例“CArray a ( {1,2, 3}, numElems );

但是,我找不到构造函数的正确语法。

template <class _T>
class CArray {
    public:
        _T* buffer;
        int length;

    CArray () : buffer (nullptr), length (0) {}

    void Create (int l) {
        buffer = new _T[length = l];
    }
       
    CArray (_T const* values, int numElems) {
        Create (numElems);
        memcpy (buffer, values, numElems * sizeof (_T));
    }
};

CArray<int> a = CArray<int>( {1,2,3}, 3 );

这既不适用于 MSVC 19 最新版本,也不适用于 gcc 11.2。我将如何编写我的构造函数来完成这项工作?

是否有可能省略“numElems”参数并从编译器获取初始化器长度(元素计数)?

【问题讨论】:

  • CArray(std::initializer_list&lt;T&gt; init)(你不需要提供大小,std::initializer_list 知道它的大小)。参见例如std::vector 构造函数,重载 (10) here
  • 另外,_T 是保留名称(下划线后跟大写),不应在代码中使用。
  • 我不知道 _T 被保留。我在模板类示例中看到过它(几年前),所以我使用了它。我将更改我的代码。谢谢提示。

标签: c++ constructor initializer-list


【解决方案1】:

是的,如果参数是对数组的引用,编译器可以推断大括号初始化列表的大小:

template<int numElems> 
CArray (_T const (&values)[numElems]) 
{
   // ...
}

然后像这样创建一个对象:

CArray<int> a = CArray<int>({1,2,3});

demo

【讨论】:

  • 我的数组类有一个动态管理的缓冲区,所以我不想要模板中的大小参数。
  • @Razzupaltuff 仅用于构造函数初始化内部数组。您仍然可以随时动态更改大小。
猜你喜欢
  • 1970-01-01
  • 2011-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-03
  • 2021-03-06
相关资源
最近更新 更多