我正在尝试编写一个仅接受 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
的参数类型替换为左值引用或按值类型传递,如下所示:
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();
}
比它编译。</p>
请注意,我需要有一个转发引用的参数。
我错过了什么?
最佳答案
如果您只想接受 vector ,那么您的代码可以简化很多。您可以指定一个带有任何类型参数的 std::vector
,而不是使用 SFINAE 。这看起来像
template <typename... Pack>
int f(std::vector<Pack...>const & a)
{
return a.size();
}
您的 SFINAE 方法不起作用的原因是,当您将左值传递给函数时,T
被推导为引用类型。当涉及到诸如
typename T::value_type
要解决此问题,您需要使用 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();
}
关于c++ - 转发引用的参数类型检查不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58806120/