【发布时间】:2019-12-13 18:23:38
【问题描述】:
我有一个急切的项目,我尝试通过编写类似以下内容的内容来尽可能轻松地启用结构的序列化:
class Data {
const QString& string();
void setString(QString string);
...
};
const QString stringName() { return "string"; }
template class <class Invokee, typename ContentType, const QString(*NameFunction)(), const ContentType& (Invokee::* Getter)() const> Field;
void serialize() {
Data data{...};
QJsonObject serialized
= serialize<Data, Field1, Field2, ...>;
}
应该输出一个json对象。我最近发现在 c++ 中有可变参数模板,并且很高兴看到我是否可以定义这样一个序列化器模板,它接受任意数量的字段,然后对它们进行序列化。但是我被以下代码卡住了:
template<
class Invokee,
typename ContentType,
const QString(*NameFunction)(),
const ContentType& (Invokee::* Getter)() const
>
void serializeToObject(QJsonObject& object, const Invokee& invokee) {
auto name = NameFunction();
object[name] = (invokee.*Getter)();
}
template<
class Invokee,
template<
class,
typename ContentType,
const QString(*)(),
const ContentType& (Invokee::* Getter)() const
> class Field,
class FieldClass,
class FieldInvokee,
typename FieldContentType,
const QString(*FieldNameFunction)(),
const FieldContentType& (Invokee::* FieldGetter)() const,
class... Args
>
void serializeToObject(QJsonObject& object, const Invokee& invokee) {
serializeToObject<FieldInvokee, FieldContentType, FieldNameFunction, FieldGetter>(object, invokee);
serializeToObject<Invokee, Args...>(object, invokee);
}
这似乎可以编译,但我还不能让它在实践中工作。即我试图这样使用它:
void tryOut() {
Data data;
data.setString("testString");
QJsonObject object{};
serializeToObject
<
Data,
Field<Data, QString, stringName, &Data::string>
>
(object, testClass);
}
编译器抱怨我对 stringName 的调用格式不正确。尽管 Field<...> 的测试实例化似乎有效,但对该函数的调用没有错误代码:
candidate template ignored: couldn't infer template argument 'NameFunction'
void serializeToObject(QJsonObject& object, Invokee& invokee) {
我在摸索自己做错了什么,或者这是否可能。
【问题讨论】:
-
[OT]:返回 const 对象是无用的(更糟糕的是,它禁止一些优化)。
-
您可能对
BOOST_HANA_DEFINE_STRUCT或同等人员感兴趣。 (当您使用 Qt 时,Q_PROPERTY 可能会有所帮助)。 -
为什么不用现成的序列化库,比如cereal?
-
@Jarod42 你的意思是在常量字段命名函数中?你有这方面的文章吗?我很想读一读。
-
@VladimirBershov 好吧,另外一个库总是需要跟踪的。但如果这不是问题,我可以看到有人会如何使用它。
标签: c++ qt templates variadic-templates template-templates