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();
}