【问题标题】:Variadic template recursive constructor problems可变模板递归构造函数问题
【发布时间】:2019-11-06 17:40:20
【问题描述】:

我试图理解递归构造函数与可变参数模板的使用。

在下面的代码中,我想实现一个带有可变参数传递值的递归构造函数。

template <class T, class... T2>
    struct Tuple{
        T value;

        Tuple(T n){                    //constructor if only one value left
           value = n;
        }

        Tuple(T n, T2... re){          //constructor if more than one value left
            T value = n;
            //Tuple(rest...);          doesnt work for me
        }
    }; 

int main(){
    Tuple<int, float, int> t(2, 1.2, 9);

    std::cout << t.value << "\n";                   //2
    std::cout << t.rest.value << "\n";              //1.2
    std::cout << t.rest.rest.value << "\n";         //9
}

【问题讨论】:

    标签: c++ templates variadic


    【解决方案1】:

    你还必须继承自Tuple&lt;T2...&gt;

    template <class T, class... T2>
    struct Tuple : public Tuple<T2...>
    

    并在初始化列表中初始化继承的类(value之前)[警告代码未测试]

       Tuple(T n, T2... re) : Tuple<T2...>{re...}, value{n}
        { }
    

    你还需要一个地面案例专业化来停止递归

    某事

    template <class T>
    struct Tuple<T>
     {
       T value;
    
       Tuple (T n) : value{n}
        { }
     }; 
    

    或者也(可能更简单)

    template <>
    struct Tuple<>
     { }; 
    

    但是对于第二种解决方案,您必须将Tuple 定义为接收零个或多个类型;也许如下

    template <typename...>
    struct Tuple
     { };
    
    template <class T, class... T2>
    struct Tuple<T, T2...> : public Tuple<T2...>
     {
       // ...
     };
    

    这样,当Tuple收到至少一种类型时,选择专精;当接收零类型时,只有主版本匹配并作为地面案例。

    【讨论】:

      猜你喜欢
      • 2021-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-02
      • 2018-05-18
      • 2016-01-02
      • 1970-01-01
      相关资源
      最近更新 更多