c++ - 是否可以创建一个模板,该模板在专门化时会产生另一个模板?

标签 c++ templates

我正在处理一些具有两种完全不同的序列化机制的不幸代码。一个使用看起来像 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/

相关文章:

c++ - 如何在 visual studio 2017 中使用 zlib 库?

c++ - 为什么静态数组成员变量在调用对象的实例后不显示任何内容?

c++ - 如何扩展 std::apply 以处理非元组类型?

c++ - static_cast 限制对公共(public)成员函数的访问?

c++ - 为派生类特化类模板方法

c++ - 有什么办法可以用模板制作容器模板吗?

c++ - 使用模板化节点的模板化列表类中缺少类型说明符

c++ - C/C++ 整数到十六进制到字符 数组到字符

c++ - 编译Template类时出现数百个错误(第一个Template类)

c++ - 有没有办法根据 lambda 参数返回类型部分特化我的模板函数?