在类构造函数中调用非默认模板构造函数

时间:2014-12-17 15:34:25

标签: c++ templates

在以下示例中是否可以调用"而不是默认构造函数"对于B类构造函数中mVector的每个元素,是否为A类?

class A {
public:
    A (int n) {/*stuff*/}
};

class B {
public:
    B (): mVector(10) {}  //call A(int n) constructor?

private:
    vector<A> mVector;
};

3 个答案:

答案 0 :(得分:5)

如果您想将所有元素设置为相同的值,那么constructor就是

mVector(10, 42)  // 10 elements initialised with value 42

如果要将元素设置为不同的值,请使用列表初始化

mVector{1,2,3,4,5,6,7,8,9,10}  // 10 elements with different values

严格地说,这并不完全符合你的描述;它创建一个临时T,然后使用它来复制初始化每个向量元素。除非您的类型具有奇怪的复制语义,否则效果应该相同。

答案 1 :(得分:0)

你可以在这做一件事: -

B() : mVector(10, A(10))
{
}

或者

B() : mVector(10, 10)
{
}

两者基本上是一回事。但是,前一个更有效率。

答案 2 :(得分:0)

您可以使用构造函数重载std::vector获取元素计数,对于您的用例相当于:

std::vector(size_type count, const T& value);

使用它来使用值类型的非默认构造函数初始化元素:

std::vector<A> mVector(10, A{0}); // 10 elements copy initialized using 'A{0}'.

或者在初始化列表中初始化时:

B() : mVector(10, A{0}) {}