2016-03-01 47 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. 
} 
相关问题