2016-03-01 40 views
4

我知道如何完善轉發參數。但是,我從不同的來源讀取(如有效的現代C++項目24 - 斯科特邁爾斯),人們可以只有完美的向前,當你有確切的模板名稱,例如:是否可以完善轉發模板模板參數

template<typename T> 
void foo(T&& param) { bar(std::forward<T>(param)); } 

如果我所尋找的是有是一種完善邁出了模板的模板參數,如:

template<template<int, class TypeT> class Vector, int Size, typename TypeT> 
void foo(Vector<Size, TypeT>&& param) { bar(std::forward<Vector<Size, TypeT>>(param)); } 

當我編譯上面,我得到一個錯誤信息:「你不能綁定一個左一個右值引用」(VC12),其中建議我知道編譯器不會將& &識別爲「通用參考」,而是作爲右值參考。這種完美的前進可能對我有用,因爲我可以利用推導出的TypeT和Size。

問題:是否有可能完善前向模板模板參數?如果是這樣,我的語法在哪裏不正確?

謝謝!

+0

不需要。你需要'T &&',稍後檢查'std :: decay_t '。 –

+0

你也可以做2次重載,一次是r值,一次是l值。 – Jarod42

回答

5

「通用參考」(標準的術語是轉發參考)是(根據定義)一個rvalue參照CV-不合格模板參數,即T&&

Vector<Size, TypeT>&&是一個右值引用,而不是轉發引用。

如果你想獲得的模板參數的值,寫一個特點:

template<class> struct vector_traits; 

template<template<int, class TypeT> class Vector, int Size, typename TypeT> 
struct vector_traits<Vector<Size, TypeT>>{ 
    static constexpr int size = Size; 
    using value_type = TypeT; 
}; 

和檢查std::decay_t<T>

template<class T> 
void foo(T&& t) { 
    using TypeT = typename vector_traits<std::decay_t<T>>::value_type; 
    // use TypeT. 
} 

你也可以將它移動到一個默認的模板參數,這使foo SFINAE友好(如果std::decay_t<T>不是「矢量」,則將其從過載組中移除):

template<class T, 
     class TypeT = typename vector_traits<std::decay_t<T>>::value_type> 
void foo(T&& t) { 
    // use TypeT. 
} 
相關問題