std :: enable_if过滤出char *类型的参数 [英] std::enable_if to filter out the argument with the type of char*
问题描述
为什么 char * pstr ="hello";pushArg(pstr);
仍会调用此类模板吗?
Why char* pstr="hello"; pushArg(pstr);
still invoke such template?
您看到已经有&(!std :: is_same< char,类型名std :: remove_cv_t< std :: remove_pointer_t< T>>>> ::: value)
.
template <typename T,
typename std::enable_if<(!std::is_same<lua_CFunction, T*>::value)
&& std::is_pointer<T>::value
&& (!std::is_same<std::string*, T>::value)
&& (!std::is_same<char, typename std::remove_cv<std::remove_pointer<T>>>::value)
&& (!std::is_same<unsigned char, typename std::remove_cv<std::remove_pointer<T>>>::value)
int pushArg(T& val)
{
}
推荐答案
首先,您已经用 C ++ 11
标记了答案,但是使用了 std :: remove_cv_t
来自C ++ 14.
First, you have tagged your answer with C++11
but you use std::remove_cv_t
from C++14.
在C ++ 17中,您的函数应如下所示:
In C++17, your function would look like this:
template <typename T,
std::enable_if_t<
std::is_pointer_v< T >
&& !std::is_same_v< std::string* , T >
&& !std::is_same_v< char , typename std::remove_cv_t<std::remove_pointer_t<T>> >
&& !std::is_same_v< unsigned char, typename std::remove_cv_t<std::remove_pointer_t<T>> >,
void
>* = nullptr
>
int pushArg(T& val) {
return 0;
}
,如果传递 char * pstr ="hello"
,则会引发错误.
and the error will be thrown in case of passing char *pstr = "hello"
.
在C ++ 11中,您缺少 typename std :: remove_cv< typename std :: remove_pointer< T> :: type> :: type
部分.完整代码如下:
And in C++11, you are missing typename std::remove_cv<typename std::remove_pointer<T>::type>::type
part. Full code below:
template <typename T,
typename std::enable_if<
std::is_pointer< T >::value
&& !std::is_same< std::string* , T >::value
&& !std::is_same< char , typename std::remove_cv<typename std::remove_pointer<T>::type>::type >::value
&& !std::is_same< unsigned char, typename std::remove_cv<typename std::remove_pointer<T>::type>::type >::value,
void
>::type* = nullptr
>
int pushArg(T& val) {
return 0;
}
这篇关于std :: enable_if过滤出char *类型的参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!