Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 转发引用的参数类型检查不起作用_C++_Templates_Forwarding Reference - Fatal编程技术网

C++ 转发引用的参数类型检查不起作用

C++ 转发引用的参数类型检查不起作用,c++,templates,forwarding-reference,C++,Templates,Forwarding Reference,我正在尝试编写一个模板函数,它只接受std::vector作为参数。然而,我提出的方法只适用于普通参数或左值参数,而不适用于转发引用参数 以下代码未编译 template <typename T, typename = typename std::enable_if< std::is_same<T, std::vector< typename T::value_type, typename T::allocator_type > >::value>::t

我正在尝试编写一个模板函数,它只接受
std::vector
作为参数。然而,我提出的方法只适用于普通参数或左值参数,而不适用于转发引用参数

以下代码未编译

template <typename T, typename = typename std::enable_if< std::is_same<T, std::vector< typename T::value_type, typename T::allocator_type > >::value>::type >
int f(T && a) {
    return a.size();
}

int main() {
    std::vector<int> a;
    f(a);
}

比它编译的要多

注意,我需要一个转发引用的参数f


我遗漏了什么?

如果只接受向量,那么代码可以简化很多。不使用SFINAE,您只需指定您想要的带有任何类型参数的
std::vector
。那看起来像

template <typename... Pack>
int f(std::vector<Pack...>const & a)
{
    return a.size();
}
要解决此问题,您需要使用
std::remove_reference
删除
T的引用。这会给你一个函数,比如

template <typename T, typename VecType = typename std::remove_reference<T>::type, typename = typename std::enable_if< std::is_same<VecType, std::vector< typename VecType::value_type, typename VecType::allocator_type > >::value>::type >
int f(T && a) {
    return a.size();
}
模板::值>::类型>
int f(T&a){
返回a.size();
}

是的,但是我不能将参数
a
作为转发引用。我将把这作为一个注释添加。谢谢。@OzgurMurat刚刚更新了答案。您不需要转发参考。你可以引用const,除非你的实际代码不同?这只是为了演示我的问题。实际代码不同。在转发引用版本中,
T
被推断为
向量&
,因此您不能仅使用
T
,您需要通过
std::remove\u reference\u T
放弃该类型的引用。是的,你说得对@rafix07
typename T::value_type
template <typename T, typename VecType = typename std::remove_reference<T>::type, typename = typename std::enable_if< std::is_same<VecType, std::vector< typename VecType::value_type, typename VecType::allocator_type > >::value>::type >
int f(T && a) {
    return a.size();
}