gpt4 book ai didi

c++ - 递归可变参数模板的基本案例特化

转载 作者:行者123 更新时间:2023-12-02 09:47:41 24 4
gpt4 key购买 nike

我的目标是定义一个Recursive类,该类以int N和一个或多个类型T, ...Ts为模板,其行为应类似于std::pair

  • std::array类型的N项的T作为first
  • ,以及作为second的,在相同std::vector和其余模板参数Recursive上模板化的N实例的可选 Ts...

  • 在尝试根据上述要求写出该类时,我想出了这个不起作用的代码(在这里我也定义了一些必要的东西,因为它们有很大帮助,它们是 Recursive的两个实例的别名),我没有不知道我是否对我上面描述的内容进行了错误的设计(或者它是不正确的描述!),或者我是否滥用了语言语法。
    #include <array>
    #include <boost/hana/fwd/optional.hpp>
    #include <boost/hana/optional.hpp>
    #include <string>
    #include <utility>
    #include <vector>

    template <int N, typename T1, typename T2, typename ...Ts>
    struct Recursive
    : std::pair<std::array<T1, N>,
    boost::hana::optional<std::vector<Recursive<N, T2, Ts...>>>> {};

    template <int N, typename T>
    struct Recursive<N, T> : std::array<T, N> {};

    template<typename ...T>
    using Recursive2 = Recursive<2u, T...>;

    template<typename ...T>
    using Recursive3 = Recursive<3u, T...>;

    int main() {
    using boost::hana::nothing;
    Recursive2<int> x(std::make_pair(std::array<int, 2>{0,0}, nothing));
    }
    我将添加到目前为止已完成的一些故障排除。在下文中,模板指定似乎可以正常工作。
    #include <iostream>

    template <int N, typename T, typename ...Ts>
    struct Recursive {
    void operator()(){ std::cout << "general\n"; }
    };

    template <int N, typename T>
    struct Recursive<N, T> {
    void operator()(){ std::cout << "specialized\n"; }
    };

    template<typename ...T>
    using Recursive2 = Recursive<2u, T...>;

    template<typename ...T>
    using Recursive3 = Recursive<3u, T...>;

    int main() {
    Recursive2<int>{}();
    Recursive2<int>{}();
    Recursive2<int,int>{}();
    }

    最佳答案

    您有几个问题:

  • 您的特化与您的主模板不匹配template <int N, typename T1, typename T2, typename ...Ts> struct Recursive;至少需要3个参数。我认为这应该是特化,主要模板应该是:
    template <int N, typename T1, typename ...Ts>
    struct Recursive;
  • template <int N, typename T> struct Recursive<N, T>的行为不像std::pair(在您声明要求时,否则用法是错误的),您可能想要以下内容:
    template <int N, typename T>
    struct Recursive<N, T> : std::pair<std::array<T, N>, decltype(boost::hana::nothing)>
  • 您需要“转发”基类的构造函数,(也可以选择使用合成代替继承,或者使用特质来定义要使用的类型)或更改构造对象的方式。

  • 结果是:
    template <int N, typename T1, typename ...Ts>
    struct Recursive;

    template <int N, typename T1, typename T2, typename ...Ts>
    struct Recursive<N, T1, T2, Ts...>
    : std::pair<std::array<T1, N>,
    boost::hana::optional<std::vector<Recursive<N, T2, Ts...>>>
    >
    {
    using std::pair<
    std::array<T1, N>,
    boost::hana::optional<std::vector<Recursive<N, T2, Ts...>>>>::pair;
    };

    template <int N, typename T>
    struct Recursive<N, T>
    : std::pair<std::array<T, N>, decltype(boost::hana::nothing)>
    {
    using std::pair<std::array<T, N>, decltype(boost::hana::nothing)>::pair;
    };

    template<typename ...T>
    using Recursive2 = Recursive<2u, T...>;

    template<typename ...T>
    using Recursive3 = Recursive<3u, T...>;

    int main() {
    using boost::hana::nothing;
    Recursive2<int> x(std::make_pair(std::array<int,2>{0,0}, nothing));
    }

    Demo

    关于c++ - 递归可变参数模板的基本案例特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64118868/

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