簡體   English   中英

可變模板遞歸構造函數問題

[英]Variadic template recursive constructor problems

我試圖了解遞歸構造函數與可變參數模板的使用。

在下面的代碼中,我想實現一個帶有可變參數傳遞值的遞歸構造函數。

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
}

您還必須從Tuple<T2...>繼承

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

並在初始化列表中初始化繼承的 class(在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接收到至少一種類型時,就選擇了專業化; 當接收零類型時,只有主版本匹配並用作地面案例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM