我正在处理一些具有两种完全不同的序列化机制的不幸代码。一个使用看起来像 template <class Archive> void serialize_v1(Archive& a)
的存档模板。 , 而另一个使用 template <template <bool> class Archive> void serialize_v2(Archive<false>& a)
.第一个重载运算符以序列化,如 a % foo
序列化,而第二个使用存档上的方法,如 a.proc_int(foo)
.
我正在尝试在两者之间编写一个适配器,这样我就不必一直编写两个序列化函数。理想情况下,我会有类似的东西:
template <class ArchiveV1>
class serialize_adapter
{
serialize_adapter(ArchiveV1& one) : one(one) { };
// functions for v2 serialization
void proc_int(int x) {
one % x;
}
ArchiveV1& one;
}
template <class ArchiveV1>
void serialize_v1(ArchiveV1& one)
{
serialize_v2(serialize_adapter(one)); // calls adapter's v2 funcs
}
然而,serialize_v2
需要 template <bool> class ArchiveV2
,这serialize_adapter(one)
不匹配 - 因为它只是一个 class ArchiveV1
.但是serialize_adapter
不能只拿 bool
- 它确实需要 ArchiveV1
范围。
看来我需要创建一个专门针对 Archive
的模板类型,这会产生一个专门针对 bool
的模板然后我可以传递给 serialize_v2
.我该如何去做,或者如果这是错误的方法,那么正确的方法是什么?
最佳答案
template <bool> class ArchiveV2
可以看作是一个元函数 S: bool -> type
.你需要的可以看作是一个元函数 A: type -> S
,即“元元函数”。返回元函数的元函数可以通过成员模板编写:
template<class ArchiveV1>
struct serialize_adapter
{
template<bool>
struct result
{
void proc_int(int x) {
one % x;
}
ArchiveV1& one;
};
};
注意与“普通”元函数的类比:
template<class X>
struct metafun
{
using result = /* some type */;
};
( result
通常被称为 type
)
适配器函数可以写成:
template <class ArchiveV1>
void serialize_v1(ArchiveV1& one)
{
using adapter = serialize_adapter<ArchiveV1>::template result<false>;
serialize_v2(adapter{one}); // calls adapter's v2 funcs
}
关于c++ - 是否可以创建一个模板,该模板在专门化时会产生另一个模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30743378/