gpt4 book ai didi

c++ - 在构造函数中初始化私有(private) std::array 成员

转载 作者:行者123 更新时间:2023-12-01 19:42:15 24 4
gpt4 key购买 nike

我想知道当初始数组值是构造函数的参数时,在构造函数中初始化类的 std::array 成员的正确方法是什么?

更具体地说,请考虑以下示例:

class Car {
public:
Car(const std::string& color, int age): color_(color), age_(age) {}
// ...
private:
std::string color_;
int age_;
};

class ThreeIdenticalCars {
private:
std::array<Car, 3> list;
public:
ThreeIdenticalCars(const std::string& color, int age):
// What to put here to initialize list to 3 identical Car(color,age) objects?
{}
};

显然,一种方法是编写 list({Car(color,age), Car(color,age), Car(color,age)}),但是如果我们想要 30 辆相同的汽车,而不是 3 辆。

如果我使用 std::vector 而不是 std::array ,解决方案将是 list(3, Car(color,age) code> (或 list(30, Car(color,age)) 但在我的问题中,列表的大小是已知的,我认为使用 std:array< 更正确.

最佳答案

数组版本的一个选项是使用模板函数来构建数组。您必须进行测试,看看这是否得到优化或在 Release模式下复制,

   #include <iostream>
#include <array>
#include <tuple>

class Car {
public:
Car(const std::string& color, int age): color_(color), age_(age) {}
// ...
//private:
std::string color_;
int age_;
};

template <typename CarType, typename... Args ,size_t... Is>
std::array<CarType,sizeof...(Is)> make_cars(std::index_sequence<Is...>,Args&&... args )
{
return { (Is,CarType(args...))... };
}

class ThreeIdenticalCars {
//private:
public:
std::array<Car, 3> list;
//public:
ThreeIdenticalCars(const std::string& color, int age) :
list(make_cars<decltype(list)::value_type>(
std::make_index_sequence<std::tuple_size<decltype(list)>::value>(),
color,
age
))
{}
};

int main()
{
ThreeIdenticalCars threecars("red", 10);

for(auto& car : threecars.list)
std::cout << car.color_ << " " << car.age_ << std::endl;

return 0;
}

Demo

关于c++ - 在构造函数中初始化私有(private) std::array 成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50741720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com