2012-02-05 33 views
0

我有一個形式的構造:轉發參數

template<class T> 
    void do_something_with_it(T*&& ptr) 
    { 
//here I can do something with this ptr 
    } 

    template<class T,class... Args> 
    void do_something_with_them(T*&& ptr, Args&&... args) 
    { 
     do_something_with_it(std::forward<T&&>(ptr)); 
     do_something_with_them(std::forward<Args&&>(args)...); 
    } 

但出於某種原因,我不能這些參數轉發。有沒有辦法做到這一點?
我正在使用gcc 4.6.1。

+0

如果我可能會問,完美的指針轉發是否會讓你獲益? – fredoverflow 2012-02-05 11:58:24

+0

#FredOverflow完美的轉發指針可能不過是完美的轉發參數指針包肯定會做,或者不是。順便說一句,我只是想學習這些東西,所以我很樂意傾聽每一個意見。謝謝。 – smallB 2012-02-05 12:02:05

回答

2

機會是你得到編譯時錯誤,因爲T*&&而不是完美的轉發車輛。只有T&&是。所以你的ptr參數只接受rvalues。除此之外,你的std::forward<T&&>應該是std::forward<T*>,但是當然現在你有其他錯誤無論如何這是無關緊要的。而且除了調用do_something_with_them失誤打的do_something_with_them零參數的基本情況,因爲如果args是空的...

如果你真的只想接受指針,你可以用enable_if而努力is_sameis_convertible。但當然我不認爲它已經「轉發」了。約

template<typename T, typename ...Args> 
auto do_something_with_them(T&&t, Args&&...args) 
    -> decltype(do_something_with_it(std::forward<T>(t))) 
{ ... } 

這樣,你讓do_something_with_it決定它是否接受參數(如果你願意,你可以把遞歸調用成decltype了。我把它作爲一個練習,讀者爲運營商所可能需要在這裏)。但當然do_something_with_it也有相同的問題,不是通用的。