gpt4 book ai didi

c++ - 将模板类初始化为基类的好方法

转载 作者:太空狗 更新时间:2023-10-29 20:05:05 25 4
gpt4 key购买 nike

我知道这个问题可能非常模糊,它是对我给出的答案的延伸 here .基本上,作为一个个人项目,我一直在尝试复制“代码优先”的习惯用法,这在 C# 程序员中很流行,但在 C++ 中进行数据库工作。一切都很好,运行良好。

C# 的一大优点是诸如属性之类的东西。我们在 C++ 中没有那种新颖性,所以我在数据库中构建的特定类的代码如下所示:

class User : public Record {
public:
User(Model& m) : Record(L"_user", m)
, Username(L"_userName", 32, false)
, Nickname(L"_nickName", 32, false) {
field(Username);
field(Nickname);
}; // eo ctor

Field<String> Username;
Field<String> Nickname;
}; // eo class User

理想情况下,我想摆脱构造函数中的 field 调用。从本质上讲,他们所做的就是向基类注册字段,然后基类进行实际工作。我怎样才能完成这种事情,并像我在构造函数中指定的那样简单地将细节传递给基类?

在上一个问题中 I answered由于 C++ 构造事物的方式,我能够提供基类信息。有没有一种方法可以在构造函数中利用它并摆脱可能引入程序员错误的讨厌的 field 调用?

在这一点上,我很高兴一切都运行良好,但我很乐意减少困惑,并在构造函数中消除这种“注册”过程的需要,并以某种方式让它们自动注册到基类。

欢迎所有意见:)

编辑

field的实现是这样的:

        void Record::field(detail::field_base& field) {
field.owner_ = this;
fields_.push_back(&field);
}; // eo field**

最佳答案

您可以拥有 Field<> 的构造函数接受指向 Record 的附加指针并调用 field(*this)在构造函数主体中的那个指针上。

template<typename T>
struct Field // Just guessing...
{
Field(std::string s, int i, bool b, Record* pRecord)
// ...
{
pRecord->field(*this);
}
// ...
};

然后,在你的User的初始化列表中你会通过 this作为额外的 Record指针,这样:

User(Model& m) : Record(L"_user", m)
, Username(L"_userName", 32, false, this)
, Nickname(L"_nickName", 32, false, this)
{
}; // eo ctor

关于c++ - 将模板类初始化为基类的好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15398806/

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