gpt4 book ai didi

c++ - 初始化类的 std::array 类型的继承成员 var 的最佳方法?

转载 作者:行者123 更新时间:2023-11-28 08:27:03 25 4
gpt4 key购买 nike

实体有一个类型为 std::array 的成员变量。 Student 继承自 Entity,并且需要初始化它继承的 std::array 成员变量。下面是我用来执行此操作的代码,但它涉及将大括号括起来的列表转换为 std::array。我不确定这是执行此操作的正确或最佳方法。在没有转换的情况下使用大括号括起来的或双大括号括起来的列表会导致编译错误。我已经尝试了其他几种初始化 std::array 成员 var 的方法,但都没有成功,所以我似乎坚持使用当前的方法。有更好的方法吗?:

template<typename... Args> struct Entity {
typedef const char* name_t;
typedef const array<const char*, sizeof...(Args)> source_names_t;

const tuple<Args...> data;
name_t name;

//This will be initialized by derived class Student.
source_names_t source_names;

Entity(
name_t tmp_name
, source_names_t tmp_source_names
)
: name(tmp_name)
, source_names(tmp_source_names)
{}
};

//idnum, fname, lname, married
struct Student : Entity<int, string, string, bool> {

Student()
: Student::Entity(
"student"

//Now Student initializes the array, but does it by casting.
, (source_names_t) {{"id", "lname", "fname", "married"}}
)
{}
};

最佳答案

有两种选择,但一种依赖于运行时大小验证。请注意,我的示例中的后者等同于强制转换。类型转换有什么问题?

#include <cassert>
#include <algorithm>
#include <array>
#include <initializer_list>
#include <iostream>

struct A {
typedef std::array<char const*, 3> T;
T data_;

A(std::initializer_list<char const*> const& data) {
assert(data.size() <= data_.size()); // or ==
// of course, use different error handling as appropriate
std::copy(data.begin(), data.end(), data_.begin());
std::fill(data_.begin() + data.size(), data_.end(), nullptr);
}

A(T const& data) : data_ (data) {}
};

int main() {
A a ({"a", "b"});
std::cout << (void const*)a.data_[2] << '\n';

A b ((A::T{"a", "b"})); // might just be the compiler I tested, but the
// extra parens were required; could be related
// to "the most vexing parse" problem
std::cout << (void const*)b.data_[2] << '\n';

return 0;
}

但是,看起来每个 Student 对象的数据都是相同的。为什么不使用虚拟方法或将共享对象传递给基本构造函数?您可以复制该对象,下面的 entity_data_ — 这相当于您当前的代码 — 或者要求它的生命周期更长并存储一个指针/引用。

struct Student : Entity<int, string, string, bool> {
Student() : Entity<int, string, string, bool>("student", entity_data_) {}
// the template arguments are still required in 0x, I believe
private:
static Entity<int, string, string, bool>::source_names_t entity_data_;
}

关于c++ - 初始化类的 std::array 类型的继承成员 var 的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3638788/

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