std::enable_if过滤掉类型为char*的参数
std::enable_if to filter out the argument with the type of char*
为什么char* pstr="hello"; pushArg(pstr);
仍然调用这样的模板?
你看已经有&&(!std::is_same<char, typename 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
标记了你的答案,但你使用了 C++14 中的 std::remove_cv_t
。
在 C++17 中,您的函数将如下所示:
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"
.
会抛出错误
而在 C++11 中,您缺少 typename std::remove_cv<typename std::remove_pointer<T>::type>::type
部分。完整代码如下:
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;
}
为什么char* pstr="hello"; pushArg(pstr);
仍然调用这样的模板?
你看已经有&&(!std::is_same<char, typename 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
标记了你的答案,但你使用了 C++14 中的 std::remove_cv_t
。
在 C++17 中,您的函数将如下所示:
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"
.
而在 C++11 中,您缺少 typename std::remove_cv<typename std::remove_pointer<T>::type>::type
部分。完整代码如下:
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;
}